let typeCases = [ "", "0", "1", "a", "aa", ] let operators = ["<", "<=", ">", ">=", "==", "!=", "===", "!=="]; function makeRope(a) { return a + a; } noInline(makeRope); function makeString(a) { return makeRope(a).slice(a.length); } noInline(makeString); for (let operator of operators) { eval(` function compareStringIdent(a, b) { return a ${operator} b; } noInline(compareStringIdent); function compareStringString(a, b) { return a ${operator} b; } noInline(compareStringString); function compareStringIdentString(a, b) { return a ${operator} b; } noInline(compareStringIdentString); function compareStringStringIdent(a, b) { return a ${operator} b; } noInline(compareStringStringIdent); `); for (let left of typeCases) { for (let right of typeCases) { let expected = eval("'" + left + "'" + operator + "'" + right + "'"); eval(` for (let i = 0; i < 1e3; ++i) { let stringIdentResult = compareStringIdent('${left}', '${right}'); if (stringIdentResult !== ${expected}) throw "Failed compareStringIdent('${left}', '${right}'), got " + stringIdentResult + " expected ${expected}"; let resolvedLeftString = makeString('${left}'); let resovledRightString = makeString('${right}'); let stringStringResult = compareStringString(resolvedLeftString, resovledRightString); if (stringStringResult !== ${expected}) throw "Failed compareStringString('${left}', '${right}'), got " + stringStringResult + " expected ${expected}"; stringStringResult = compareStringString(makeString('${left}'), makeString('${right}')); if (stringStringResult !== ${expected}) throw "Failed compareStringString('${left}', '${right}'), got " + stringStringResult + " expected ${expected}"; if (compareStringIdentString(makeString('${left}'), '${right}') !== ${expected}) throw "Failed compareStringIdentString('${left}', '${right}'), expected was ${expected}"; if (compareStringStringIdent('${left}', makeString('${right}')) !== ${expected}) throw "Failed compareStringStringIdent('${left}', '${right}'), expected was ${expected}"; if (('${left}' ${operator} '${right}') !== ${expected}) throw "Failed constant folding of ('${left}' ${operator} '${right}'). How do you even fail constant folding?"; } `) } } }