diff options
Diffstat (limited to 'test/scanners/javascript/trace-test.in.js')
-rw-r--r-- | test/scanners/javascript/trace-test.in.js | 5930 |
1 files changed, 0 insertions, 5930 deletions
diff --git a/test/scanners/javascript/trace-test.in.js b/test/scanners/javascript/trace-test.in.js deleted file mode 100644 index de0e03e..0000000 --- a/test/scanners/javascript/trace-test.in.js +++ /dev/null @@ -1,5930 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/** - * A number of the tests in this file depend on the setting of - * HOTLOOP. Define some constants up front, so they're easy to grep - * for. - */ -// The HOTLOOP constant we depend on; only readable from our stats -// object in debug builds. -const haveTracemonkey = !!(this.tracemonkey) -const HOTLOOP = haveTracemonkey ? tracemonkey.HOTLOOP : 2; -// The loop count at which we trace -const RECORDLOOP = HOTLOOP; -// The loop count at which we run the trace -const RUNLOOP = HOTLOOP + 1; - -var gDoMandelbrotTest = true; -if ("gSkipSlowTests" in this && gSkipSlowTests) { - print("** Skipping slow tests"); - gDoMandelbrotTest = false; -} - -if (!('gSrcdir' in this)) - gSrcdir = '.'; - -if (!('gReportSummary' in this)) - gReportSummary = true; - -var testName = null; -if ("arguments" in this && arguments.length > 0) - testName = arguments[0]; -var fails = [], passes = []; - -function jitstatHandler(f) -{ - if (!haveTracemonkey) - return; - - // XXXbz this is a nasty hack, but I can't figure out a way to - // just use jitstats.tbl here - f("recorderStarted"); - f("recorderAborted"); - f("traceCompleted"); - f("sideExitIntoInterpreter"); - f("timeoutIntoInterpreter"); - f("typeMapMismatchAtEntry"); - f("returnToDifferentLoopHeader"); - f("traceTriggered"); - f("globalShapeMismatchAtEntry"); - f("treesTrashed"); - f("slotPromoted"); - f("unstableLoopVariable"); - f("breakLoopExits"); - f("returnLoopExits"); - f("mergedLoopExits") - f("noCompatInnerTrees"); - f("blacklisted"); -} - -var jitProps = {}; -jitstatHandler(function(prop) { - jitProps[prop] = true; - }); -var hadJITstats = false; -for (var p in jitProps) - hadJITstats = true; - -function test(f) -{ - // Clear out any accumulated confounding state in the oracle / JIT cache. - gc(); - - if (!testName || testName == f.name) { - var expectedJITstats = f.jitstats; - if (hadJITstats && expectedJITstats) - { - var expectedProps = {}; - jitstatHandler(function(prop) { - if (prop in expectedJITstats) - expectedProps[prop] = true; - }); - for (var p in expectedJITstats) - { - if (!(p in expectedProps)) - throw "Bad property in " + f.name + ".jitstats: " + p; - } - } - - // Collect our jit stats - var localJITstats = {}; - jitstatHandler(function(prop) { - localJITstats[prop] = tracemonkey[prop]; - }); - check(f.name, f(), f.expected, localJITstats, expectedJITstats); - } -} - -function map_test(t, cases) -{ - for (var i = 0; i < cases.length; i++) { - function c() { return t(cases[i].input); } - c.expected = cases[i].expected; - c.name = t.name + "(" + uneval(cases[i].input) + ")"; - test(c); - } -} - -// Use this function to compare expected and actual test results. -// Types must match. -// For numbers, treat NaN as matching NaN, distinguish 0 and -0, and -// tolerate a certain degree of error for other values. -// -// These are the same criteria used by the tests in js/tests, except that -// we distinguish 0 and -0. -function close_enough(expected, actual) -{ - if (typeof expected != typeof actual) - return false; - if (typeof expected != 'number') - return actual == expected; - - // Distinguish NaN from other values. Using x != x comparisons here - // works even if tests redefine isNaN. - if (actual != actual) - return expected != expected - if (expected != expected) - return false; - - // Tolerate a certain degree of error. - if (actual != expected) - return Math.abs(actual - expected) <= 1E-10; - - // Distinguish 0 and -0. - if (actual == 0) - return (1 / actual > 0) == (1 / expected > 0); - - return true; -} - -function check(desc, actual, expected, oldJITstats, expectedJITstats) -{ - if (close_enough(expected, actual)) { - var pass = true; - jitstatHandler(function(prop) { - if (expectedJITstats && prop in expectedJITstats && - expectedJITstats[prop] != - tracemonkey[prop] - oldJITstats[prop]) { - pass = false; - } - }); - if (pass) { - passes.push(desc); - return print("TEST-PASS | trace-test.js |", desc); - } - } - fails.push(desc); - var expectedStats = ""; - if (expectedJITstats) { - jitstatHandler(function(prop) { - if (prop in expectedJITstats) { - if (expectedStats) - expectedStats += " "; - expectedStats += - prop + ": " + expectedJITstats[prop]; - } - }); - } - var actualStats = ""; - if (expectedJITstats) { - jitstatHandler(function(prop) { - if (prop in expectedJITstats) { - if (actualStats) - actualStats += " "; - actualStats += prop + ": " + (tracemonkey[prop]-oldJITstats[prop]); - } - }); - } - print("TEST-UNEXPECTED-FAIL | trace-test.js |", desc, ": expected", typeof(expected), - "(", uneval(expected), ")", - (expectedStats ? " [" + expectedStats + "] " : ""), - "!= actual", - typeof(actual), "(", uneval(actual), ")", - (actualStats ? " [" + actualStats + "] " : "")); -} - -function ifInsideLoop() -{ - var cond = true, intCond = 5, count = 0; - for (var i = 0; i < 100; i++) { - if (cond) - count++; - if (intCond) - count++; - } - return count; -} -ifInsideLoop.expected = 200; -test(ifInsideLoop); - -function bitwiseAnd_inner(bitwiseAndValue) { - for (var i = 0; i < 60000; i++) - bitwiseAndValue = bitwiseAndValue & i; - return bitwiseAndValue; -} -function bitwiseAnd() -{ - return bitwiseAnd_inner(12341234); -} -bitwiseAnd.expected = 0; -test(bitwiseAnd); - -if (!testName || testName == "bitwiseGlobal") { - bitwiseAndValue = Math.pow(2,32); - for (var i = 0; i < 60000; i++) - bitwiseAndValue = bitwiseAndValue & i; - check("bitwiseGlobal", bitwiseAndValue, 0); -} - - -function equalInt() -{ - var i1 = 55, one = 1, zero = 0, undef; - var o1 = { }, o2 = { }; - var s = "5"; - var hits = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; - for (var i = 0; i < 5000; i++) { - if (i1 == 55) hits[0]++; - if (i1 != 56) hits[1]++; - if (i1 < 56) hits[2]++; - if (i1 > 50) hits[3]++; - if (i1 <= 60) hits[4]++; - if (i1 >= 30) hits[5]++; - if (i1 == 7) hits[6]++; - if (i1 != 55) hits[7]++; - if (i1 < 30) hits[8]++; - if (i1 > 90) hits[9]++; - if (i1 <= 40) hits[10]++; - if (i1 >= 70) hits[11]++; - if (o1 == o2) hits[12]++; - if (o2 != null) hits[13]++; - if (s < 10) hits[14]++; - if (true < zero) hits[15]++; - if (undef > one) hits[16]++; - if (undef < zero) hits[17]++; - } - return hits.toString(); -} -equalInt.expected = "5000,5000,5000,5000,5000,5000,0,0,0,0,0,0,0,5000,5000,0,0,0"; -test(equalInt); - -var a; -function setelem() -{ - a = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; - a = a.concat(a, a, a); - var l = a.length; - for (var i = 0; i < l; i++) { - a[i] = i; - } - return a.toString(); -} -setelem.expected = "0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83"; -test(setelem); - -function getelem_inner(a) -{ - var accum = 0; - var l = a.length; - for (var i = 0; i < l; i++) { - accum += a[i]; - } - return accum; -} -function getelem() -{ - return getelem_inner(a); -} -getelem.expected = 3486; -test(getelem); - -globalName = 907; -function name() -{ - var a = 0; - for (var i = 0; i < 100; i++) - a = globalName; - return a; -} -name.expected = 907; -test(name); - -var globalInt = 0; -if (!testName || testName == "globalGet") { - for (var i = 0; i < 500; i++) - globalInt = globalName + i; - check("globalGet", globalInt, globalName + 499); -} - -if (!testName || testName == "globalSet") { - for (var i = 0; i < 500; i++) - globalInt = i; - check("globalSet", globalInt, 499); -} - -function arith() -{ - var accum = 0; - for (var i = 0; i < 100; i++) { - accum += (i * 2) - 1; - } - return accum; -} -arith.expected = 9800; -test(arith); - -function lsh_inner(n) -{ - var r; - for (var i = 0; i < 35; i++) - r = 0x1 << n; - return r; -} -map_test (lsh_inner, - [{input: 15, expected: 32768}, - {input: 55, expected: 8388608}, - {input: 1, expected: 2}, - {input: 0, expected: 1}]); - -function rsh_inner(n) -{ - var r; - for (var i = 0; i < 35; i++) - r = 0x11010101 >> n; - return r; -} -map_test (rsh_inner, - [{input: 8, expected: 1114369}, - {input: 5, expected: 8914952}, - {input: 35, expected: 35659808}, - {input: -1, expected: 0}]); - -function ursh_inner(n) -{ - var r; - for (var i = 0; i < 35; i++) - r = -55 >>> n; - return r; -} -map_test (ursh_inner, - [{input: 8, expected: 16777215}, - {input: 33, expected: 2147483620}, - {input: 0, expected: 4294967241}, - {input: 1, expected: 2147483620}]); - -function doMath_inner(cos) -{ - var s = 0; - var sin = Math.sin; - for (var i = 0; i < 200; i++) - s = -Math.pow(sin(i) + cos(i * 0.75), 4); - return s; -} -function doMath() { - return doMath_inner(Math.cos); -} -doMath.expected = -0.5405549555611059; -test(doMath); - -function fannkuch() { - var count = Array(8); - var r = 8; - var done = 0; - while (done < 40) { - // write-out the first 30 permutations - done += r; - while (r != 1) { count[r - 1] = r; r--; } - while (true) { - count[r] = count[r] - 1; - if (count[r] > 0) break; - r++; - } - } - return done; -} -fannkuch.expected = 41; -test(fannkuch); - -function xprop() -{ - a = 0; - for (var i = 0; i < 20; i++) - a += 7; - return a; -} -xprop.expected = 140; -test(xprop); - -var a = 2; -function getprop_inner(o2) -{ - var o = {a:5}; - var t = this; - var x = 0; - for (var i = 0; i < 20; i++) { - t = this; - x += o.a + o2.a + this.a + t.a; - } - return x; -} -function getprop() { - return getprop_inner({a:9}); -} -getprop.expected = 360; -test(getprop); - -function mod() -{ - var mods = [-1,-1,-1,-1]; - var a = 9.5, b = -5, c = 42, d = (1/0); - for (var i = 0; i < 20; i++) { - mods[0] = a % b; - mods[1] = b % 1; - mods[2] = c % d; - mods[3] = c % a; - mods[4] = b % 0; - } - return mods.toString(); -} -mod.expected = "4.5,0,42,4,NaN"; -test(mod); - -function glob_f1() { - return 1; -} -function glob_f2() { - return glob_f1(); -} -function call() -{ - var q1 = 0, q2 = 0, q3 = 0, q4 = 0, q5 = 0; - var o = {}; - function f1() { - return 1; - } - function f2(f) { - return f(); - } - o.f = f1; - for (var i = 0; i < 100; ++i) { - q1 += f1(); - q2 += f2(f1); - q3 += glob_f1(); - q4 += o.f(); - q5 += glob_f2(); - } - var ret = String([q1, q2, q3, q4, q5]); - return ret; -} -call.expected = "100,100,100,100,100"; -test(call); - -function setprop() -{ - var obj = { a:-1 }; - var obj2 = { b:-1, a:-1 }; - for (var i = 0; i < 20; i++) { - obj2.b = obj.a = i; - } - return [obj.a, obj2.a, obj2.b].toString(); -} -setprop.expected = "19,-1,19"; -test(setprop); - -function testif() { - var q = 0; - for (var i = 0; i < 100; i++) { - if ((i & 1) == 0) - q++; - else - q--; - } - return q; -} -testif.expected = 0; -test(testif); - -var globalinc = 0; -function testincops(n) { - var i = 0, o = {p:0}, a = [0]; - n = 100; - - for (i = 0; i < n; i++); - while (i-- > 0); - for (i = 0; i < n; ++i); - while (--i >= 0); - - for (o.p = 0; o.p < n; o.p++) globalinc++; - while (o.p-- > 0) --globalinc; - for (o.p = 0; o.p < n; ++o.p) ++globalinc; - while (--o.p >= 0) globalinc--; - - ++i; // set to 0 - for (a[i] = 0; a[i] < n; a[i]++); - while (a[i]-- > 0); - for (a[i] = 0; a[i] < n; ++a[i]); - while (--a[i] >= 0); - - return [++o.p, ++a[i], globalinc].toString(); -} -testincops.expected = "0,0,0"; -test(testincops); - -function trees() { - var i = 0, o = [0,0,0]; - for (i = 0; i < 100; ++i) { - if ((i & 1) == 0) o[0]++; - else if ((i & 2) == 0) o[1]++; - else o[2]++; - } - return String(o); -} -trees.expected = "50,25,25"; -test(trees); - -function unboxint() { - var q = 0; - var o = [4]; - for (var i = 0; i < 100; ++i) - q = o[0] << 1; - return q; -} -unboxint.expected = 8; -test(unboxint); - -function strings() -{ - var a = [], b = -1; - var s = "abcdefghij", s2 = "a"; - var f = "f"; - var c = 0, d = 0, e = 0, g = 0; - for (var i = 0; i < 10; i++) { - a[i] = (s.substring(i, i+1) + s[i] + String.fromCharCode(s2.charCodeAt(0) + i)).concat(i) + i; - if (s[i] == f) - c++; - if (s[i] != 'b') - d++; - if ("B" > s2) - g++; // f already used - if (s2 < "b") - e++; - b = s.length; - } - return a.toString() + b + c + d + e + g; -} -strings.expected = "aaa00,bbb11,ccc22,ddd33,eee44,fff55,ggg66,hhh77,iii88,jjj991019100"; -test(strings); - -function dependentStrings() -{ - var a = []; - var t = "abcdefghijklmnopqrst"; - for (var i = 0; i < 10; i++) { - var s = t.substring(2*i, 2*i + 2); - a[i] = s + s.length; - } - return a.join(""); -} -dependentStrings.expected = "ab2cd2ef2gh2ij2kl2mn2op2qr2st2"; -test(dependentStrings); - -function stringConvert() -{ - var a = []; - var s1 = "F", s2 = "1.3", s3 = "5"; - for (var i = 0; i < 10; i++) { - a[0] = 1 >> s1; - a[1] = 10 - s2; - a[2] = 15 * s3; - a[3] = s3 | 32; - a[4] = s2 + 60; - // a[5] = 9 + s3; - // a[6] = -s3; - a[7] = s3 & "7"; - // a[8] = ~s3; - } - return a.toString(); -} -stringConvert.expected = "1,8.7,75,37,1.360,,,5"; -test(stringConvert); - -function orTestHelper(a, b, n) -{ - var k = 0; - for (var i = 0; i < n; i++) { - if (a || b) - k += i; - } - return k; -} - -var orNaNTest1, orNaNTest2; - -orNaNTest1 = new Function("return orTestHelper(NaN, NaN, 10);"); -orNaNTest1.name = 'orNaNTest1'; -orNaNTest1.expected = 0; -orNaNTest2 = new Function("return orTestHelper(NaN, 1, 10);"); -orNaNTest2.name = 'orNaNTest2'; -orNaNTest2.expected = 45; -test(orNaNTest1); -test(orNaNTest2); - -function andTestHelper(a, b, n) -{ - var k = 0; - for (var i = 0; i < n; i++) { - if (a && b) - k += i; - } - return k; -} - -if (!testName || testName == "truthies") { - (function () { - var opsies = ["||", "&&"]; - var falsies = [null, undefined, false, NaN, 0, ""]; - var truthies = [{}, true, 1, 42, 1/0, -1/0, "blah"]; - var boolies = [falsies, truthies]; - - // The for each here should abort tracing, so that this test framework - // relies only on the interpreter while the orTestHelper and andTestHelper - // functions get trace-JITed. - for each (var op in opsies) { - for (var i in boolies) { - for (var j in boolies[i]) { - var x = uneval(boolies[i][j]); - for (var k in boolies) { - for (var l in boolies[k]) { - var y = uneval(boolies[k][l]); - var prefix = (op == "||") ? "or" : "and"; - var f = new Function("return " + prefix + "TestHelper(" + x + "," + y + ",10)"); - f.name = prefix + "Test(" + x + "," + y + ")"; - f.expected = eval(x + op + y) ? 45 : 0; - test(f); - } - } - } - } - } - })(); -} - -function nonEmptyStack1Helper(o, farble) { - var a = []; - var j = 0; - for (var i in o) - a[j++] = i; - return a.join(""); -} - -function nonEmptyStack1() { - return nonEmptyStack1Helper({a:1,b:2,c:3,d:4,e:5,f:6,g:7,h:8}, "hi"); -} - -nonEmptyStack1.expected = "abcdefgh"; -test(nonEmptyStack1); - -function nonEmptyStack2() -{ - var a = 0; - for (var c in {a:1, b:2, c:3}) { - for (var i = 0; i < 10; i++) - a += i; - } - return String(a); -} -nonEmptyStack2.expected = "135"; -test(nonEmptyStack2); - -function arityMismatchMissingArg(arg) -{ - for (var a = 0, i = 1; i < 10000; i *= 2) { - a += i; - } - return a; -} -arityMismatchMissingArg.expected = 16383; -test(arityMismatchMissingArg); - -function arityMismatchExtraArg() -{ - return arityMismatchMissingArg(1, 2); -} -arityMismatchExtraArg.expected = 16383; -test(arityMismatchExtraArg); - -function MyConstructor(i) -{ - this.i = i; -} -MyConstructor.prototype.toString = function() {return this.i + ""}; - -function newTest() -{ - var a = []; - for (var i = 0; i < 10; i++) - a[i] = new MyConstructor(i); - return a.join(""); -} -newTest.expected = "0123456789"; -test(newTest); - -// The following functions use a delay line of length 2 to change the value -// of the callee without exiting the traced loop. This is obviously tuned to -// match the current HOTLOOP setting of 2. -function shapelessArgCalleeLoop(f, g, h, a) -{ - for (var i = 0; i < 10; i++) { - f(i, a); - f = g; - g = h; - } -} - -function shapelessVarCalleeLoop(f0, g, h, a) -{ - var f = f0; - for (var i = 0; i < 10; i++) { - f(i, a); - f = g; - g = h; - } -} - -function shapelessLetCalleeLoop(f0, g, h, a) -{ - for (var i = 0; i < 10; i++) { - let f = f0; - f(i, a); - f = g; - g = h; - } -} - -function shapelessUnknownCalleeLoop(n, f, g, h, a) -{ - for (var i = 0; i < 10; i++) { - (n || f)(i, a); - f = g; - g = h; - } -} - -function shapelessCalleeTest() -{ - var a = []; - - var helper = function (i, a) a[i] = i; - shapelessArgCalleeLoop(helper, helper, function (i, a) a[i] = -i, a); - - helper = function (i, a) a[10 + i] = i; - shapelessVarCalleeLoop(helper, helper, function (i, a) a[10 + i] = -i, a); - - helper = function (i, a) a[20 + i] = i; - shapelessLetCalleeLoop(helper, helper, function (i, a) a[20 + i] = -i, a); - - helper = function (i, a) a[30 + i] = i; - shapelessUnknownCalleeLoop(null, helper, helper, function (i, a) a[30 + i] = -i, a); - - try { - helper = {hack: 42}; - shapelessUnknownCalleeLoop(null, helper, helper, helper, a); - } catch (e) { - if (e + "" != "TypeError: f is not a function") - print("shapelessUnknownCalleeLoop: unexpected exception " + e); - } - return a.join(""); -} -shapelessCalleeTest.expected = "01-2-3-4-5-6-7-8-901-2-3-4-5-6-7-8-9012345678901-2-3-4-5-6-7-8-9"; -test(shapelessCalleeTest); - -function typeofTest() -{ - var values = ["hi", "hi", "hi", null, 5, 5.1, true, undefined, /foo/, typeofTest, [], {}], types = []; - for (var i = 0; i < values.length; i++) - types[i] = typeof values[i]; - return types.toString(); -} -typeofTest.expected = "string,string,string,object,number,number,boolean,undefined,object,function,object,object"; -test(typeofTest); - -function joinTest() -{ - var s = ""; - var a = []; - for (var i = 0; i < 8; i++) - a[i] = [String.fromCharCode(97 + i)]; - for (i = 0; i < 8; i++) { - for (var j = 0; j < 8; j++) - a[i][1 + j] = j; - } - for (i = 0; i < 8; i++) - s += a[i].join(","); - return s; -} -joinTest.expected = "a,0,1,2,3,4,5,6,7b,0,1,2,3,4,5,6,7c,0,1,2,3,4,5,6,7d,0,1,2,3,4,5,6,7e,0,1,2,3,4,5,6,7f,0,1,2,3,4,5,6,7g,0,1,2,3,4,5,6,7h,0,1,2,3,4,5,6,7"; -test(joinTest); - -function arity1(x) -{ - return (x == undefined) ? 1 : 0; -} -function missingArgTest() { - var q; - for (var i = 0; i < 10; i++) { - q = arity1(); - } - return q; -} -missingArgTest.expected = 1; -test(missingArgTest); - -JSON = function () { - return { - stringify: function stringify(value, whitelist) { - switch (typeof(value)) { - case "object": - return value.constructor.name; - } - } - }; -}(); - -function missingArgTest2() { - var testPairs = [ - ["{}", {}], - ["[]", []], - ['{"foo":"bar"}', {"foo":"bar"}], - ] - - var a = []; - for (var i=0; i < testPairs.length; i++) { - var s = JSON.stringify(testPairs[i][1]) - a[i] = s; - } - return a.join(","); -} -missingArgTest2.expected = "Object,Array,Object"; -test(missingArgTest2); - -function deepForInLoop() { - // NB: the number of props set in C is arefully tuned to match HOTLOOP = 2. - function C(){this.p = 1, this.q = 2} - C.prototype = {p:1, q:2, r:3, s:4, t:5}; - var o = new C; - var j = 0; - var a = []; - for (var i in o) - a[j++] = i; - return a.join(""); -} -deepForInLoop.expected = "pqrst"; -test(deepForInLoop); - -function nestedExit(x) { - var q = 0; - for (var i = 0; i < 10; ++i) - { - if (x) - ++q; - } -} -function nestedExitLoop() { - for (var j = 0; j < 10; ++j) - nestedExit(j < 7); - return "ok"; -} -nestedExitLoop.expected = "ok"; -test(nestedExitLoop); - -function bitsinbyte(b) { - var m = 1, c = 0; - while(m<0x100) { - if(b & m) c++; - m <<= 1; - } - return 1; -} -function TimeFunc(func) { - var x,y; - for(var y=0; y<256; y++) func(y); -} -function nestedExit2() { - TimeFunc(bitsinbyte); - return "ok"; -} -nestedExit2.expected = "ok"; -test(nestedExit2); - -function parsingNumbers() { - var s1 = "123"; - var s1z = "123zzz"; - var s2 = "123.456"; - var s2z = "123.456zzz"; - - var e1 = 123; - var e2 = 123.456; - - var r1, r1z, r2, r2z; - - for (var i = 0; i < 10; i++) { - r1 = parseInt(s1); - r1z = parseInt(s1z); - r2 = parseFloat(s2); - r2z = parseFloat(s2z); - } - - if (r1 == e1 && r1z == e1 && r2 == e2 && r2z == e2) - return "ok"; - return "fail"; -} -parsingNumbers.expected = "ok"; -test(parsingNumbers); - -function matchInLoop() { - var k = "hi"; - for (var i = 0; i < 10; i++) { - var result = k.match(/hi/) != null; - } - return result; -} -matchInLoop.expected = true; -test(matchInLoop); - -function testMatchAsCondition() { - var a = ['0', '0', '0', '0']; - var r = /0/; - "x".q; - for (var z = 0; z < 4; z++) - a[z].match(r) ? 1 : 2; -} -test(testMatchAsCondition); - -function deep1(x) { - if (x > 90) - return 1; - return 2; -} -function deep2() { - for (var i = 0; i < 100; ++i) - deep1(i); - return "ok"; -} -deep2.expected = "ok"; -test(deep2); - -function heavyFn1(i) { - if (i == 3) { - var x = 3; - return [0, i].map(function (i) i + x); - } - return []; -} -function testHeavy() { - for (var i = 0; i <= 3; i++) - heavyFn1(i); -} -test(testHeavy); - -function heavyFn2(i) { - if (i < 1000) - return heavyFn1(i); - return function () i; -} -function testHeavy2() { - for (var i = 0; i <= 3; i++) - heavyFn2(i); -} -test(testHeavy2); - -var merge_type_maps_x = 0, merge_type_maps_y = 0; -function merge_type_maps() { - for (merge_type_maps_x = 0; merge_type_maps_x < 50; ++merge_type_maps_x) - if ((merge_type_maps_x & 1) == 1) - ++merge_type_maps_y; - return [merge_type_maps_x,merge_type_maps_y].join(","); -} -merge_type_maps.expected = "50,25"; -test(merge_type_maps) - -function inner_double_outer_int() { - function f(i) { - for (var m = 0; m < 20; ++m) - for (var n = 0; n < 100; n += i) - ; - return n; - } - return f(.5); -} -inner_double_outer_int.expected = 100; -test(inner_double_outer_int); - -function newArrayTest() -{ - var a = []; - for (var i = 0; i < 10; i++) - a[i] = new Array(); - return a.map(function(x) x.length).toString(); -} -newArrayTest.expected="0,0,0,0,0,0,0,0,0,0"; -test(newArrayTest); - -function stringSplitTest() -{ - var s = "a,b" - var a = null; - for (var i = 0; i < 10; ++i) - a = s.split(","); - return a.join(); -} -stringSplitTest.expected="a,b"; -test(stringSplitTest); - -function stringSplitIntoArrayTest() -{ - var s = "a,b" - var a = []; - for (var i = 0; i < 10; ++i) - a[i] = s.split(","); - return a.join(); -} -stringSplitIntoArrayTest.expected="a,b,a,b,a,b,a,b,a,b,a,b,a,b,a,b,a,b,a,b"; -test(stringSplitIntoArrayTest); - -function forVarInWith() { - function foo() ({notk:42}); - function bar() ({p:1, q:2, r:3, s:4, t:5}); - var o = foo(); - var a = []; - with (o) { - for (var k in bar()) - a[a.length] = k; - } - return a.join(""); -} -forVarInWith.expected = "pqrst"; -test(forVarInWith); - -function inObjectTest() { - var o = {p: 1, q: 2, r: 3, s: 4, t: 5}; - var r = 0; - for (var i in o) { - if (!(i in o)) - break; - if ((i + i) in o) - break; - ++r; - } - return r; -} -inObjectTest.expected = 5; -test(inObjectTest); - -function inArrayTest() { - var a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; - for (var i = 0; i < a.length; i++) { - if (!(i in a)) - break; - } - return i; -} -inArrayTest.expected = 10; -test(inArrayTest); - -function innerLoopIntOuterDouble() { - var n = 10000, i=0, j=0, count=0, limit=0; - for (i = 1; i <= n; ++i) { - limit = i * 1; - for (j = 0; j < limit; ++j) { - ++count; - } - } - return "" + count; -} -innerLoopIntOuterDouble.expected="50005000"; -test(innerLoopIntOuterDouble); - -function outerline(){ - var i=0; - var j=0; - - for (i = 3; i<= 100000; i+=2) - { - for (j = 3; j < 1000; j+=2) - { - if ((i & 1) == 1) - break; - } - } - return "ok"; -} -outerline.expected="ok"; -test(outerline); - -function addAccumulations(f) { - var a = f(); - var b = f(); - return a() + b(); -} - -function loopingAccumulator() { - var x = 0; - return function () { - for (var i = 0; i < 10; ++i) { - ++x; - } - return x; - } -} - -function testLoopingAccumulator() { - var x = addAccumulations(loopingAccumulator); - return x; -} -testLoopingAccumulator.expected = 20; -test(testLoopingAccumulator); - -function testBranchingLoop() { - var x = 0; - for (var i=0; i < 100; ++i) { - if (i == 51) { - x += 10; - } - x++; - } - return x; -} -testBranchingLoop.expected = 110; -test(testBranchingLoop); - -function testBranchingUnstableLoop() { - var x = 0; - for (var i=0; i < 100; ++i) { - if (i == 51) { - x += 10.1; - } - x++; - } - return x; -} -testBranchingUnstableLoop.expected = 110.1; -test(testBranchingUnstableLoop); - -function testBranchingUnstableLoopCounter() { - var x = 0; - for (var i=0; i < 100; ++i) { - if (i == 51) { - i += 1.1; - } - x++; - } - return x; -} -testBranchingUnstableLoopCounter.expected = 99; -test(testBranchingUnstableLoopCounter); - - -function testBranchingUnstableObject() { - var x = {s: "a"}; - var t = ""; - for (var i=0; i < 100; ++i) { - if (i == 51) - { - x.s = 5; - } - t += x.s; - } - return t.length; -} -testBranchingUnstableObject.expected = 100; -test(testBranchingUnstableObject); - -function testArrayDensityChange() { - var x = []; - var count = 0; - for (var i=0; i < 100; ++i) { - x[i] = "asdf"; - } - for (var i=0; i < x.length; ++i) { - if (i == 51) - { - x[199] = "asdf"; - } - if (x[i]) - count += x[i].length; - } - return count; -} -testArrayDensityChange.expected = 404; -test(testArrayDensityChange); - -function testDoubleToStr() { - var x = 0.0; - var y = 5.5; - for (var i = 0; i < 200; i++) { - x += parseFloat(y.toString()); - } - return x; -} -testDoubleToStr.expected = 5.5*200; -test(testDoubleToStr); - -function testNumberToString() { - var x = new Number(0); - for (var i = 0; i < 4; i++) - x.toString(); -} -test(testNumberToString); - -function testDecayingInnerLoop() { - var i, j, k = 10; - for (i = 0; i < 5000; ++i) { - for (j = 0; j < k; ++j); - --k; - } - return i; -} -testDecayingInnerLoop.expected = 5000; -test(testDecayingInnerLoop); - -function testContinue() { - var i; - var total = 0; - for (i = 0; i < 20; ++i) { - if (i == 11) - continue; - total++; - } - return total; -} -testContinue.expected = 19; -test(testContinue); - -function testContinueWithLabel() { - var i = 0; - var j = 20; - checkiandj : - while (i < 10) { - i += 1; - checkj : - while (j > 10) { - j -= 1; - if ((j % 2) == 0) - continue checkj; - } - } - return i + j; -} -testContinueWithLabel.expected = 20; -test(testContinueWithLabel); - -function testDivision() { - var a = 32768; - var b; - while (b !== 1) { - b = a / 2; - a = b; - } - return a; -} -testDivision.expected = 1; -test(testDivision); - -function testDivisionFloat() { - var a = 32768.0; - var b; - while (b !== 1) { - b = a / 2.0; - a = b; - } - return a === 1.0; -} -testDivisionFloat.expected = true; -test(testDivisionFloat); - -function testToUpperToLower() { - var s = "Hello", s1, s2; - for (i = 0; i < 100; ++i) { - s1 = s.toLowerCase(); - s2 = s.toUpperCase(); - } - return s1 + s2; -} -testToUpperToLower.expected = "helloHELLO"; -test(testToUpperToLower); - -function testReplace2() { - var s = "H e l l o", s1; - for (i = 0; i < 100; ++i) - s1 = s.replace(" ", ""); - return s1; -} -testReplace2.expected = "He l l o"; -test(testReplace2); - -function testBitwise() { - var x = 10000; - var y = 123456; - var z = 987234; - for (var i = 0; i < 50; i++) { - x = x ^ y; - y = y | z; - z = ~x; - } - return x + y + z; -} -testBitwise.expected = -1298; -test(testBitwise); - -function testSwitch() { - var x = 0; - var ret = 0; - for (var i = 0; i < 100; ++i) { - switch (x) { - case 0: - ret += 1; - break; - case 1: - ret += 2; - break; - case 2: - ret += 3; - break; - case 3: - ret += 4; - break; - default: - x = 0; - } - x++; - } - return ret; -} -testSwitch.expected = 226; -test(testSwitch); - -function testSwitchString() { - var x = "asdf"; - var ret = 0; - for (var i = 0; i < 100; ++i) { - switch (x) { - case "asdf": - x = "asd"; - ret += 1; - break; - case "asd": - x = "as"; - ret += 2; - break; - case "as": - x = "a"; - ret += 3; - break; - case "a": - x = "foo"; - ret += 4; - break; - default: - x = "asdf"; - } - } - return ret; -} -testSwitchString.expected = 200; -test(testSwitchString); - -function testNegZero1Helper(z) { - for (let j = 0; j < 5; ++j) { z = -z; } - return Math.atan2(0, -0) == Math.atan2(0, z); -} - -var testNegZero1 = function() { return testNegZero1Helper(0); } -testNegZero1.expected = true; -testNegZero1.name = 'testNegZero1'; -testNegZero1Helper(1); -test(testNegZero1); - -// No test case, just make sure this doesn't assert. -function testNegZero2() { - var z = 0; - for (let j = 0; j < 5; ++j) { ({p: (-z)}); } -} -testNegZero2(); - -function testConstSwitch() { - var x; - for (var j=0;j<5;++j) { switch(1.1) { case NaN: case 2: } x = 2; } - return x; -} -testConstSwitch.expected = 2; -test(testConstSwitch); - -function testConstSwitch2() { - var x; - for (var j = 0; j < 4; ++j) { switch(0/0) { } } - return "ok"; -} -testConstSwitch2.expected = "ok"; -test(testConstSwitch2); - -function testConstIf() { - var x; - for (var j=0;j<5;++j) { if (1.1 || 5) { } x = 2;} - return x; -} -testConstIf.expected = 2; -test(testConstIf); - -function testTypeofHole() { - var a = new Array(6); - a[5] = 3; - for (var i = 0; i < 6; ++i) - a[i] = typeof a[i]; - return a.join(","); -} -testTypeofHole.expected = "undefined,undefined,undefined,undefined,undefined,number" -test(testTypeofHole); - -function testNativeLog() { - var a = new Array(5); - for (var i = 0; i < 5; i++) { - a[i] = Math.log(Math.pow(Math.E, 10)); - } - return a.join(","); -} -testNativeLog.expected = "10,10,10,10,10"; -test(testNativeLog); - -function test_JSOP_ARGSUB() { - function f0() { return arguments[0]; } - function f1() { return arguments[1]; } - function f2() { return arguments[2]; } - function f3() { return arguments[3]; } - function f4() { return arguments[4]; } - function f5() { return arguments[5]; } - function f6() { return arguments[6]; } - function f7() { return arguments[7]; } - function f8() { return arguments[8]; } - function f9() { return arguments[9]; } - var a = []; - for (var i = 0; i < 10; i++) { - a[0] = f0('a'); - a[1] = f1('a','b'); - a[2] = f2('a','b','c'); - a[3] = f3('a','b','c','d'); - a[4] = f4('a','b','c','d','e'); - a[5] = f5('a','b','c','d','e','f'); - a[6] = f6('a','b','c','d','e','f','g'); - a[7] = f7('a','b','c','d','e','f','g','h'); - a[8] = f8('a','b','c','d','e','f','g','h','i'); - a[9] = f9('a','b','c','d','e','f','g','h','i','j'); - } - return a.join(""); -} -test_JSOP_ARGSUB.expected = "abcdefghij"; -test(test_JSOP_ARGSUB); - -function test_JSOP_ARGCNT() { - function f0() { return arguments.length; } - function f1() { return arguments.length; } - function f2() { return arguments.length; } - function f3() { return arguments.length; } - function f4() { return arguments.length; } - function f5() { return arguments.length; } - function f6() { return arguments.length; } - function f7() { return arguments.length; } - function f8() { return arguments.length; } - function f9() { return arguments.length; } - var a = []; - for (var i = 0; i < 10; i++) { - a[0] = f0('a'); - a[1] = f1('a','b'); - a[2] = f2('a','b','c'); - a[3] = f3('a','b','c','d'); - a[4] = f4('a','b','c','d','e'); - a[5] = f5('a','b','c','d','e','f'); - a[6] = f6('a','b','c','d','e','f','g'); - a[7] = f7('a','b','c','d','e','f','g','h'); - a[8] = f8('a','b','c','d','e','f','g','h','i'); - a[9] = f9('a','b','c','d','e','f','g','h','i','j'); - } - return a.join(","); -} -test_JSOP_ARGCNT.expected = "1,2,3,4,5,6,7,8,9,10"; -test(test_JSOP_ARGCNT); - -function testNativeMax() { - var out = [], k; - for (var i = 0; i < 5; ++i) { - k = Math.max(k, i); - } - out.push(k); - - k = 0; - for (var i = 0; i < 5; ++i) { - k = Math.max(k, i); - } - out.push(k); - - for (var i = 0; i < 5; ++i) { - k = Math.max(0, -0); - } - out.push((1 / k) < 0); - return out.join(","); -} -testNativeMax.expected = "NaN,4,false"; -test(testNativeMax); - -function testFloatArrayIndex() { - var a = []; - for (var i = 0; i < 10; ++i) { - a[3] = 5; - a[3.5] = 7; - } - return a[3] + "," + a[3.5]; -} -testFloatArrayIndex.expected = "5,7"; -test(testFloatArrayIndex); - -function testStrict() { - var n = 10, a = []; - for (var i = 0; i < 10; ++i) { - a[0] = (n === 10); - a[1] = (n !== 10); - a[2] = (n === null); - a[3] = (n == null); - } - return a.join(","); -} -testStrict.expected = "true,false,false,false"; -test(testStrict); - -function testSetPropNeitherMissNorHit() { - for (var j = 0; j < 5; ++j) { if (({}).__proto__ = 1) { } } - return "ok"; -} -testSetPropNeitherMissNorHit.expected = "ok"; -test(testSetPropNeitherMissNorHit); - -function testPrimitiveConstructorPrototype() { - var f = function(){}; - f.prototype = false; - for (let j=0;j<5;++j) { new f; } - return "ok"; -} -testPrimitiveConstructorPrototype.expected = "ok"; -test(testPrimitiveConstructorPrototype); - -function testSideExitInConstructor() { - var FCKConfig = {}; - FCKConfig.CoreStyles = - { - 'Bold': { }, - 'Italic': { }, - 'FontFace': { }, - 'Size' : - { - Overrides: [ ] - }, - - 'Color' : - { - Element: '', - Styles: { }, - Overrides: [ ] - }, - 'BackColor': { - Element : '', - Styles : { 'background-color' : '' } - }, - - }; - var FCKStyle = function(A) { - A.Element; - }; - - var pass = true; - for (var s in FCKConfig.CoreStyles) { - var x = new FCKStyle(FCKConfig.CoreStyles[s]); - if (!x) - pass = false; - } - return pass; -} -testSideExitInConstructor.expected = true; -test(testSideExitInConstructor); - -function testNot() { - var a = new Object(), b = null, c = "foo", d = "", e = 5, f = 0, g = 5.5, h = -0, i = true, j = false, k = undefined; - var r; - for (var i = 0; i < 10; ++i) - r = [!a, !b, !c, !d, !e, !f, !g, !h, !i, !j, !k]; - return r.join(","); -} -testNot.expected = "false,true,false,true,false,true,false,true,false,true,true"; -test(testNot); - -function doTestDifferingArgc(a, b) -{ - var k = 0; - for (var i = 0; i < 10; i++) - { - k += i; - } - return k; -} -function testDifferingArgc() -{ - var x = 0; - x += doTestDifferingArgc(1, 2); - x += doTestDifferingArgc(1); - x += doTestDifferingArgc(1, 2, 3); - return x; -} -testDifferingArgc.expected = 45*3; -test(testDifferingArgc); - -function doTestMoreArgcThanNargs() -{ - var x = 0; - for (var i = 0; i < 10; i++) - { - x = x + arguments[3]; - } - return x; -} -function testMoreArgcThanNargs() -{ - return doTestMoreArgcThanNargs(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); -} -testMoreArgcThanNargs.expected = 4*10; -test(testMoreArgcThanNargs); - -// Test stack reconstruction after a nested exit -function testNestedExitStackInner(j, counter) { - ++counter; - var b = 0; - for (var i = 1; i <= RUNLOOP; i++) { - ++b; - var a; - // Make sure that once everything has been traced we suddenly switch to - // a different control flow the first time we run the outermost tree, - // triggering a side exit. - if (j < RUNLOOP) - a = 1; - else - a = 0; - ++b; - b += a; - } - return counter + b; -} -function testNestedExitStackOuter() { - var counter = 0; - for (var j = 1; j <= RUNLOOP; ++j) { - for (var k = 1; k <= RUNLOOP; ++k) { - counter = testNestedExitStackInner(j, counter); - } - } - return counter; -} -testNestedExitStackOuter.expected = 81; -test(testNestedExitStackOuter); - -function testHOTLOOPSize() { - return HOTLOOP > 1; -} -testHOTLOOPSize.expected = true; -test(testHOTLOOPSize); - -function testMatchStringObject() { - var a = new String("foo"); - var b; - for (i = 0; i < 300; i++) - b = a.match(/bar/); - return b; -} -testMatchStringObject.expected = null; -test(testMatchStringObject); - -function innerSwitch(k) -{ - var m = 0; - - switch (k) - { - case 0: - m = 1; - break; - } - - return m; -} -function testInnerSwitchBreak() -{ - var r = new Array(5); - for (var i = 0; i < 5; i++) - { - r[i] = innerSwitch(0); - } - - return r.join(","); -} -testInnerSwitchBreak.expected = "1,1,1,1,1"; -test(testInnerSwitchBreak); - -function testArrayNaNIndex() -{ - for (var j = 0; j < 4; ++j) { [this[NaN]]; } - for (var j = 0; j < 5; ++j) { if([1][-0]) { } } - return "ok"; -} -testArrayNaNIndex.expected = "ok"; -test(testArrayNaNIndex); - -function innerTestInnerMissingArgs(a,b,c,d) -{ - if (a) { - } else { - } -} -function doTestInnerMissingArgs(k) -{ - for (i = 0; i < 10; i++) { - innerTestInnerMissingArgs(k); - } -} -function testInnerMissingArgs() -{ - doTestInnerMissingArgs(1); - doTestInnerMissingArgs(0); - return 1; -} -testInnerMissingArgs.expected = 1; //Expected: that we don't crash. -test(testInnerMissingArgs); - -function regexpLastIndex() -{ - var n = 0; - var re = /hi/g; - var ss = " hi hi hi hi hi hi hi hi hi hi"; - for (var i = 0; i < 10; i++) { - // re.exec(ss); - n += (re.lastIndex > 0) ? 3 : 0; - re.lastIndex = 0; - } - return n; -} -regexpLastIndex.expected = 0; // 30; -test(regexpLastIndex); - -function testHOTLOOPCorrectness() { - var b = 0; - for (var i = 0; i < HOTLOOP; ++i) - ++b; - return b; -} -testHOTLOOPCorrectness.expected = HOTLOOP; -testHOTLOOPCorrectness.jitstats = { - recorderStarted: 1, - recorderAborted: 0, - traceTriggered: 0 -}; -// Change the global shape right before doing the test -this.testHOTLOOPCorrectnessVar = 1; -test(testHOTLOOPCorrectness); - -function testRUNLOOPCorrectness() { - var b = 0; - for (var i = 0; i < RUNLOOP; ++i) { - ++b; - } - return b; -} -testRUNLOOPCorrectness.expected = RUNLOOP; -testRUNLOOPCorrectness.jitstats = { - recorderStarted: 1, - recorderAborted: 0, - traceTriggered: 1 -}; -// Change the global shape right before doing the test -this.testRUNLOOPCorrectnessVar = 1; -test(testRUNLOOPCorrectness); - -function testDateNow() { - // Accessing global.Date for the first time will change the global shape, - // so do it before the loop starts; otherwise we have to loop an extra time - // to pick things up. - var time = Date.now(); - for (var j = 0; j < RUNLOOP; ++j) - time = Date.now(); - return "ok"; -} -testDateNow.expected = "ok"; -testDateNow.jitstats = { - recorderStarted: 1, - recorderAborted: 0, - traceTriggered: 1 -}; -test(testDateNow); - -function testINITELEM() -{ - var x; - for (var i = 0; i < 10; ++i) - x = { 0: 5, 1: 5 }; - return x[0] + x[1]; -} -testINITELEM.expected = 10; -test(testINITELEM); - -function testUndefinedBooleanCmp() -{ - var t = true, f = false, x = []; - for (var i = 0; i < 10; ++i) { - x[0] = t == undefined; - x[1] = t != undefined; - x[2] = t === undefined; - x[3] = t !== undefined; - x[4] = t < undefined; - x[5] = t > undefined; - x[6] = t <= undefined; - x[7] = t >= undefined; - x[8] = f == undefined; - x[9] = f != undefined; - x[10] = f === undefined; - x[11] = f !== undefined; - x[12] = f < undefined; - x[13] = f > undefined; - x[14] = f <= undefined; - x[15] = f >= undefined; - } - return x.join(","); -} -testUndefinedBooleanCmp.expected = "false,true,false,true,false,false,false,false,false,true,false,true,false,false,false,false"; -test(testUndefinedBooleanCmp); - -function testConstantBooleanExpr() -{ - for (var j = 0; j < 3; ++j) { if(true <= true) { } } - return "ok"; -} -testConstantBooleanExpr.expected = "ok"; -test(testConstantBooleanExpr); - -function testNegativeGETELEMIndex() -{ - for (let i=0;i<3;++i) /x/[-4]; - return "ok"; -} -testNegativeGETELEMIndex.expected = "ok"; -test(testNegativeGETELEMIndex); - -function doTestInvalidCharCodeAt(input) -{ - var q = ""; - for (var i = 0; i < 10; i++) - q += input.charCodeAt(i); - return q; -} -function testInvalidCharCodeAt() -{ - return doTestInvalidCharCodeAt(""); -} -testInvalidCharCodeAt.expected = "NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN"; -test(testInvalidCharCodeAt); - -function FPQuadCmp() -{ - for (let j = 0; j < 3; ++j) { true == 0; } - return "ok"; -} -FPQuadCmp.expected = "ok"; -test(FPQuadCmp); - -function testDestructuring() { - var t = 0; - for (var i = 0; i < HOTLOOP + 1; ++i) { - var [r, g, b] = [1, 1, 1]; - t += r + g + b; - } - return t -} -testDestructuring.expected = (HOTLOOP + 1) * 3; -test(testDestructuring); - -function loopWithUndefined1(t, val) { - var a = new Array(6); - for (var i = 0; i < 6; i++) - a[i] = (t > val); - return a; -} -loopWithUndefined1(5.0, 2); //compile version with val=int - -function testLoopWithUndefined1() { - return loopWithUndefined1(5.0).join(","); //val=undefined -}; -testLoopWithUndefined1.expected = "false,false,false,false,false,false"; -test(testLoopWithUndefined1); - -function loopWithUndefined2(t, dostuff, val) { - var a = new Array(6); - for (var i = 0; i < 6; i++) { - if (dostuff) { - val = 1; - a[i] = (t > val); - } else { - a[i] = (val == undefined); - } - } - return a; -} -function testLoopWithUndefined2() { - var a = loopWithUndefined2(5.0, true, 2); - var b = loopWithUndefined2(5.0, true); - var c = loopWithUndefined2(5.0, false, 8); - var d = loopWithUndefined2(5.0, false); - return [a[0], b[0], c[0], d[0]].join(","); -} -testLoopWithUndefined2.expected = "true,true,false,true"; -test(testLoopWithUndefined2); - -//test no multitrees assert -function testBug462388() { - var c = 0, v; for each (let x in ["",v,v,v]) { for (c=0;c<4;++c) { } } - return true; -} -testBug462388.expected = true; -test(testBug462388); - -//test no multitrees assert -function testBug462407() { - for each (let i in [0, {}, 0, 1.5, {}, 0, 1.5, 0, 0]) { } - return true; -} -testBug462407.expected = true; -test(testBug462407); - -//test no multitrees assert -function testBug463490() { - function f(a, b, d) { - for (var i = 0; i < 10; i++) { - if (d) - b /= 2; - } - return a + b; - } - //integer stable loop - f(2, 2, false); - //double stable loop - f(3, 4.5, false); - //integer unstable branch - f(2, 2, true); - return true; -}; -testBug463490.expected = true; -test(testBug463490); - -// Test no assert (bug 464089) -function shortRecursiveLoop(b, c) { - for (var i = 0; i < c; i++) { - if (b) - shortRecursiveLoop(c - 1); - } -} -function testClosingRecursion() { - shortRecursiveLoop(false, 1); - shortRecursiveLoop(true, 3); - return true; -} -testClosingRecursion.expected = true; -test(testClosingRecursion); - -// Test no assert or crash from outer recorders (bug 465145) -function testBug465145() { - this.__defineSetter__("x", function(){}); - this.watch("x", function(){}); - y = this; - for (var z = 0; z < 2; ++z) { x = y }; - this.__defineSetter__("x", function(){}); - for (var z = 0; z < 2; ++z) { x = y }; -} - -function testTrueShiftTrue() { - var a = new Array(5); - for (var i=0;i<5;++i) a[i] = "" + (true << true); - return a.join(","); -} -testTrueShiftTrue.expected = "2,2,2,2,2"; -test(testTrueShiftTrue); - -// Test no assert or crash -function testBug465261() { - for (let z = 0; z < 2; ++z) { for each (let x in [0, true, (void 0), 0, (void - 0)]) { if(x){} } }; - return true; -} -testBug465261.expected = true; -test(testBug465261); - -function testBug465272() { - var a = new Array(5); - for (j=0;j<5;++j) a[j] = "" + ((5) - 2); - return a.join(","); -} -testBug465272.expected = "3,3,3,3,3" -test(testBug465272); - -function testBug465483() { - var a = new Array(4); - var c = 0; - for each (i in [4, 'a', 'b', (void 0)]) a[c++] = '' + (i + i); - return a.join(','); -} -testBug465483.expected = '8,aa,bb,NaN'; -test(testBug465483); - -function testNullCallee() { - try { - function f() { - var x = new Array(5); - for (var i = 0; i < 5; i++) - x[i] = a[i].toString(); - return x.join(','); - } - f([[1],[2],[3],[4],[5]]); - f([null, null, null, null, null]); - } catch (e) { - return true; - } - return false; -} -testNullCallee.expected = true; -test(testNullCallee); - -//test no multitrees assert -function testBug466128() { - for (let a = 0; a < 3; ++a) { - for each (let b in [1, 2, "three", 4, 5, 6, 7, 8]) { - } - } - return true; -} -testBug466128.expected = true; -test(testBug466128); - -//test no assert -function testBug465688() { - for each (let d in [-0x80000000, -0x80000000]) - -d; - return true; -} -testBug465688.expected = true; -test(testBug465688); - -//test no assert -function testBug466262() { - var e = 1; - for (var d = 0; d < 3; ++d) { - if (d == 2) { - e = ""; - } - } - return true; -} -testBug466262.expected = true; -test(testBug466262); - -function testNewDate() -{ - // Accessing global.Date for the first time will change the global shape, - // so do it before the loop starts; otherwise we have to loop an extra time - // to pick things up. - var start = new Date(); - var time = new Date(); - for (var j = 0; j < RUNLOOP; ++j) - time = new Date(); - return time > 0 && time >= start; -} -testNewDate.expected = true; -testNewDate.jitstats = { - recorderStarted: 1, - recorderAborted: 0, - traceTriggered: 1 -}; -test(testNewDate); - -function testArrayPushPop() { - var a = [], sum1 = 0, sum2 = 0; - for (var i = 0; i < 10; ++i) - sum1 += a.push(i); - for (var i = 0; i < 10; ++i) - sum2 += a.pop(); - a.push(sum1); - a.push(sum2); - return a.join(","); -} -testArrayPushPop.expected = "55,45"; -test(testArrayPushPop); - -function testSlowArrayPop() { - var a = []; - for (var i = 0; i < RUNLOOP; i++) - a[i] = [0]; - a[RUNLOOP-1].__defineGetter__("0", function () { return 'xyzzy'; }); - - var last; - for (var i = 0; i < RUNLOOP; i++) - last = a[i].pop(); // reenters interpreter in getter - return last; -} -testSlowArrayPop.expected = 'xyzzy'; -test(testSlowArrayPop); - -// Same thing but it needs to reconstruct multiple stack frames (so, -// multiple functions called inside the loop) -function testSlowArrayPopMultiFrame() { - var a = []; - for (var i = 0; i < RUNLOOP; i++) - a[i] = [0]; - a[RUNLOOP-1].__defineGetter__("0", function () { return 23; }); - - function child(a, i) { - return a[i].pop(); // reenters interpreter in getter - } - function parent(a, i) { - return child(a, i); - } - function gramps(a, i) { - return parent(a, i); - } - - var last; - for (var i = 0; i < RUNLOOP; i++) - last = gramps(a, i); - return last; -} -testSlowArrayPopMultiFrame.expected = 23; -test(testSlowArrayPopMultiFrame); - -// Same thing but nested trees, each reconstructing one or more stack frames -// (so, several functions with loops, such that the loops end up being -// nested though they are not lexically nested) - -function testSlowArrayPopNestedTrees() { - var a = []; - for (var i = 0; i < RUNLOOP; i++) - a[i] = [0]; - a[RUNLOOP-1].__defineGetter__("0", function () { return 3.14159 }); - - function child(a, i, j, k) { - var last = 2.71828; - for (var l = 0; l < RUNLOOP; l++) - if (i == RUNLOOP-1 && j == RUNLOOP-1 && k == RUNLOOP-1) - last = a[l].pop(); // reenters interpreter in getter - return last; - } - function parent(a, i, j) { - var last; - for (var k = 0; k < RUNLOOP; k++) - last = child(a, i, j, k); - return last; - } - function gramps(a, i) { - var last; - for (var j = 0; j < RUNLOOP; j++) - last = parent(a, i, j); - return last; - } - - var last; - for (var i = 0; i < RUNLOOP; i++) - last = gramps(a, i); - return last; -} -testSlowArrayPopNestedTrees.expected = 3.14159; -test(testSlowArrayPopNestedTrees); - -function testResumeOp() { - var a = [1,"2",3,"4",5,"6",7,"8",9,"10",11,"12",13,"14",15,"16"]; - var x = ""; - while (a.length > 0) - x += a.pop(); - return x; -} -testResumeOp.expected = "16151413121110987654321"; -test(testResumeOp); - -function testUndefinedCmp() { - var a = false; - for (var j = 0; j < 4; ++j) { if (undefined < false) { a = true; } } - return a; -} -testUndefinedCmp.expected = false; -test(testUndefinedCmp); - -function reallyDeepNestedExit(schedule) -{ - var c = 0, j = 0; - for (var i = 0; i < 5; i++) { - for (j = 0; j < 4; j++) { - c += (schedule[i*4 + j] == 1) ? 1 : 2; - } - } - return c; -} -function testReallyDeepNestedExit() -{ - var c = 0; - var schedule1 = new Array(5*4); - var schedule2 = new Array(5*4); - for (var i = 0; i < 5*4; i++) { - schedule1[i] = 0; - schedule2[i] = 0; - } - /** - * First innermost compile: true branch runs through. - * Second '': false branch compiles new loop edge. - * First outer compile: expect true branch. - * Second '': hit false branch. - */ - schedule1[0*4 + 3] = 1; - var schedules = [schedule1, - schedule2, - schedule1, - schedule2, - schedule2]; - - for (var i = 0; i < 5; i++) { - c += reallyDeepNestedExit(schedules[i]); - } - return c; -} -testReallyDeepNestedExit.expected = 198; -test(testReallyDeepNestedExit); - -function testRegExpTest() { - var r = /abc/; - var flag = false; - for (var i = 0; i < 10; ++i) - flag = r.test("abc"); - return flag; -} -testRegExpTest.expected = true; -test(testRegExpTest); - -function testNumToString() { - var r = []; - var d = 123456789; - for (var i = 0; i < 10; ++i) { - r = [ - d.toString(), - (-d).toString(), - d.toString(10), - (-d).toString(10), - d.toString(16), - (-d).toString(16), - d.toString(36), - (-d).toString(36) - ]; - } - return r.join(","); -} -testNumToString.expected = "123456789,-123456789,123456789,-123456789,75bcd15,-75bcd15,21i3v9,-21i3v9"; -test(testNumToString); - -function testLongNumToString() { - var s; - for (var i = 0; i < 5; i++) - s = (0x08000000).toString(2); - return s; -} -testLongNumToString.expected = '1000000000000000000000000000'; -test(testLongNumToString); - -function testSubstring() { - for (var i = 0; i < 5; ++i) { - actual = "".substring(5); - } - return actual; -} -testSubstring.expected = ""; -test(testSubstring); - -function testForInLoopChangeIteratorType() { - for(y in [0,1,2]) y = NaN; - (function(){ - [].__proto__.u = void 0; - for (let y in [5,6,7,8]) - y = NaN; - delete [].__proto__.u; - })() - return "ok"; -} -testForInLoopChangeIteratorType.expected = "ok"; -test(testForInLoopChangeIteratorType); - -function testGrowDenseArray() { - var a = new Array(); - for (var i = 0; i < 10; ++i) - a[i] |= 5; - return a.join(","); -} -testGrowDenseArray.expected = "5,5,5,5,5,5,5,5,5,5"; -test(testGrowDenseArray); - -function testCallProtoMethod() { - function X() { this.x = 1; } - X.prototype.getName = function () { return "X"; } - - function Y() { this.x = 2; } - Y.prototype.getName = function() "Y"; - - var a = [new X, new X, new X, new X, new Y]; - var s = ''; - for (var i = 0; i < a.length; i++) - s += a[i].getName(); - return s; -} -testCallProtoMethod.expected = 'XXXXY'; -test(testCallProtoMethod); - -function testTypeUnstableForIn() { - var a = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]; - var x = 0; - for (var i in a) { - i = parseInt(i); - x++; - } - return x; -} -testTypeUnstableForIn.expected = 16; -test(testTypeUnstableForIn); - -function testAddUndefined() { - for (var j = 0; j < 3; ++j) - (0 + void 0) && 0; -} -test(testAddUndefined); - -function testStringify() { - var t = true, f = false, u = undefined, n = 5, d = 5.5, s = "x"; - var a = []; - for (var i = 0; i < 10; ++i) { - a[0] = "" + t; - a[1] = t + ""; - a[2] = "" + f; - a[3] = f + ""; - a[4] = "" + u; - a[5] = u + ""; - a[6] = "" + n; - a[7] = n + ""; - a[8] = "" + d; - a[9] = d + ""; - a[10] = "" + s; - a[11] = s + ""; - } - return a.join(","); -} -testStringify.expected = "true,true,false,false,undefined,undefined,5,5,5.5,5.5,x,x"; -test(testStringify); - -function testObjectToString() { - var o = {toString: function()"foo"}; - var s = ""; - for (var i = 0; i < 10; i++) - s += o; - return s; -} -testObjectToString.expected = "foofoofoofoofoofoofoofoofoofoo"; -test(testObjectToString); - -function testObjectToNumber() { - var o = {valueOf: function()-3}; - var x = 0; - for (var i = 0; i < 10; i++) - x -= o; - return x; -} -testObjectToNumber.expected = 30; -test(testObjectToNumber); - -function my_iterator_next() { - if (this.i == 10) { - this.i = 0; - throw this.StopIteration; - } - return this.i++; -} -function testCustomIterator() { - var o = { - __iterator__: function () { - return { - i: 0, - next: my_iterator_next, - StopIteration: StopIteration - }; - } - }; - var a=[]; - for (var k = 0; k < 100; k += 10) { - for(var j in o) { - a[k + (j >> 0)] = j*k; - } - } - return a.join(); -} -testCustomIterator.expected = "0,0,0,0,0,0,0,0,0,0,0,10,20,30,40,50,60,70,80,90,0,20,40,60,80,100,120,140,160,180,0,30,60,90,120,150,180,210,240,270,0,40,80,120,160,200,240,280,320,360,0,50,100,150,200,250,300,350,400,450,0,60,120,180,240,300,360,420,480,540,0,70,140,210,280,350,420,490,560,630,0,80,160,240,320,400,480,560,640,720,0,90,180,270,360,450,540,630,720,810"; -test(testCustomIterator); - -function bug464403() { - print(8); - var u = [print, print, function(){}] - for each (x in u) for (u.e in [1,1,1,1]); - return "ok"; -} -bug464403.expected = "ok"; -test(bug464403); - -function testBoxDoubleWithDoubleSizedInt() -{ - var i = 0; - var a = new Array(3); - - while (i < a.length) - a[i++] = 0x5a827999; - return a.join(","); -} -testBoxDoubleWithDoubleSizedInt.expected = "1518500249,1518500249,1518500249"; -test(testBoxDoubleWithDoubleSizedInt); - -function testObjectOrderedCmp() -{ - var a = new Array(5); - for(var i=0;i<5;++i) a[i] = ({} < {}); - return a.join(","); -} -testObjectOrderedCmp.expected = "false,false,false,false,false"; -test(testObjectOrderedCmp); - -function testObjectOrderedCmp2() -{ - var a = new Array(5); - for(var i=0;i<5;++i) a[i] = ("" <= null); - return a.join(","); -} -testObjectOrderedCmp2.expected = "true,true,true,true,true"; -test(testObjectOrderedCmp2); - -function testLogicalNotNaN() { - var i = 0; - var a = new Array(5); - while (i < a.length) - a[i++] = !NaN; - return a.join(); -} -testLogicalNotNaN.expected = "true,true,true,true,true"; -test(testLogicalNotNaN); - -function testStringToInt32() { - var s = ""; - for (let j = 0; j < 5; ++j) s += ("1e+81" ^ 3); - return s; -} -testStringToInt32.expected = "33333"; -test(testStringToInt32); - -function testIn() { - var array = [3]; - var obj = { "-1": 5, "1.7": 3, "foo": 5, "1": 7 }; - var a = []; - for (let j = 0; j < 5; ++j) { - a.push("0" in array); - a.push(-1 in obj); - a.push(1.7 in obj); - a.push("foo" in obj); - a.push(1 in obj); - a.push("1" in array); - a.push(-2 in obj); - a.push(2.7 in obj); - a.push("bar" in obj); - a.push(2 in obj); - } - return a.join(","); -} -testIn.expected = "true,true,true,true,true,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false,true,true,true,true,true,false,false,false,false,false"; -test(testIn); - -function testBranchCse() { - empty = []; - out = []; - for (var j=0;j<10;++j) { empty[42]; out.push((1 * (1)) | ""); } - return out.join(","); -} -testBranchCse.expected = "1,1,1,1,1,1,1,1,1,1"; -test(testBranchCse); - -function testMulOverflow() { - var a = []; - for (let j=0;j<5;++j) a.push(0 | ((0x60000009) * 0x60000009)); - return a.join(","); -} -testMulOverflow.expected = "-1073741824,-1073741824,-1073741824,-1073741824,-1073741824"; -test(testMulOverflow); - -function testThinLoopDemote() { - function f() - { - var k = 1; - for (var n = 0; n < 4; n++) { - k = (k * 10); - } - return k; - } - f(); - return f(); -} -testThinLoopDemote.expected = 10000; -testThinLoopDemote.jitstats = { - recorderStarted: 1, - recorderAborted: 0, - traceCompleted: 1, - traceTriggered: 2, - unstableLoopVariable: 0 -}; -test(testThinLoopDemote); - -var global = this; -function testWeirdDateParseOuter() -{ - var vDateParts = ["11", "17", "2008"]; - var out = []; - for (var vI = 0; vI < vDateParts.length; vI++) - out.push(testWeirdDateParseInner(vDateParts[vI])); - /* Mutate the global shape so we fall off trace; this causes - * additional oddity */ - global.x = Math.random(); - return out; -} -function testWeirdDateParseInner(pVal) -{ - var vR = 0; - for (var vI = 0; vI < pVal.length; vI++) { - var vC = pVal.charAt(vI); - if ((vC >= '0') && (vC <= '9')) - vR = (vR * 10) + parseInt(vC); - } - return vR; -} -function testWeirdDateParse() { - var result = []; - result.push(testWeirdDateParseInner("11")); - result.push(testWeirdDateParseInner("17")); - result.push(testWeirdDateParseInner("2008")); - result.push(testWeirdDateParseInner("11")); - result.push(testWeirdDateParseInner("17")); - result.push(testWeirdDateParseInner("2008")); - result = result.concat(testWeirdDateParseOuter()); - result = result.concat(testWeirdDateParseOuter()); - result.push(testWeirdDateParseInner("11")); - result.push(testWeirdDateParseInner("17")); - result.push(testWeirdDateParseInner("2008")); - return result.join(","); -} -testWeirdDateParse.expected = "11,17,2008,11,17,2008,11,17,2008,11,17,2008,11,17,2008"; -testWeirdDateParse.jitstats = { - recorderStarted: 8, - recorderAborted: 1, - traceCompleted: 7, - traceTriggered: 14, - unstableLoopVariable: 3, - noCompatInnerTrees: 1 -}; -test(testWeirdDateParse); - -function testUndemotableBinaryOp() { - var out = []; - for (let j = 0; j < 5; ++j) { out.push(6 - ((void 0) ^ 0x80000005)); } - return out.join(","); -} -testUndemotableBinaryOp.expected = "2147483649,2147483649,2147483649,2147483649,2147483649"; -test(testUndemotableBinaryOp); - -function testNullRelCmp() { - var out = []; - for(j=0;j<3;++j) { out.push(3 > null); out.push(3 < null); out.push(0 == null); out.push(3 == null); } - return out.join(","); -} -testNullRelCmp.expected = "true,false,false,false,true,false,false,false,true,false,false,false"; -test(testNullRelCmp); - -function testEqFalseEmptyString() { - var x = []; - for (var i=0;i<5;++i) x.push(false == ""); - return x.join(","); -} -testEqFalseEmptyString.expected = "true,true,true,true,true"; -test(testEqFalseEmptyString); - -function testIncDec2(ii) { - var x = []; - for (let j=0;j<5;++j) { - ii=j; - jj=j; - var kk=j; - x.push(ii--); - x.push(jj--); - x.push(kk--); - x.push(++ii); - x.push(++jj); - x.push(++kk); - } - return x.join(","); -} -function testIncDec() { - return testIncDec2(0); -} -testIncDec.expected = "0,0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4"; -test(testIncDec); - -function testApply() { - var q = []; - for (var i = 0; i < 10; ++i) - Array.prototype.push.apply(q, [5]); - return q.join(","); -} -testApply.expected = "5,5,5,5,5,5,5,5,5,5"; -test(testApply); - -function testNestedForIn() { - var a = {x: 1, y: 2, z: 3}; - var s = ''; - for (var p1 in a) - for (var p2 in a) - s += p1 + p2 + ' '; - return s; -} -testNestedForIn.expected = 'xx xy xz yx yy yz zx zy zz '; -test(testNestedForIn); - -function testForEach() { - var r; - var a = ["zero", "one", "two", "three"]; - for (var i = 0; i < RUNLOOP; i++) { - r = ""; - for each (var s in a) - r += s + " "; - } - return r; -} -testForEach.expected = "zero one two three "; -test(testForEach); - -function testThinForEach() { - var a = ["red"]; - var n = 0; - for (var i = 0; i < 10; i++) - for each (var v in a) - if (v) - n++; - return n; -} -testThinForEach.expected = 10; -test(testThinForEach); - -function testComparisons() -{ - // All the special values from each of the types in - // ECMA-262, 3rd ed. section 8 - var undefinedType, nullType, booleanType, stringType, numberType, objectType; - - var types = []; - types[undefinedType = 0] = "Undefined"; - types[nullType = 1] = "Null"; - types[booleanType = 2] = "Boolean"; - types[stringType = 3] = "String"; - types[numberType = 4] = "Number"; - types[objectType = 5] = "Object"; - - var JSVAL_INT_MIN = -Math.pow(2, 30); - var JSVAL_INT_MAX = Math.pow(2, 30) - 1; - - // Values from every ES3 type, hitting all the edge-case and special values - // that can be dreamed up - var values = - { - "undefined": - { - value: function() { return undefined; }, - type: undefinedType - }, - "null": - { - value: function() { return null; }, - type: nullType - }, - "true": - { - value: function() { return true; }, - type: booleanType - }, - "false": - { - value: function() { return false; }, - type: booleanType - }, - '""': - { - value: function() { return ""; }, - type: stringType - }, - '"a"': - { - // a > [, for string-object comparisons - value: function() { return "a"; }, - type: stringType - }, - '"Z"': - { - // Z < [, for string-object comparisons - value: function() { return "Z"; }, - type: stringType - }, - "0": - { - value: function() { return 0; }, - type: numberType - }, - "-0": - { - value: function() { return -0; }, - type: numberType - }, - "1": - { - value: function() { return 1; }, - type: numberType - }, - "Math.E": - { - value: function() { return Math.E; }, - type: numberType - }, - "JSVAL_INT_MIN - 1": - { - value: function() { return JSVAL_INT_MIN - 1; }, - type: numberType - }, - "JSVAL_INT_MIN": - { - value: function() { return JSVAL_INT_MIN; }, - type: numberType - }, - "JSVAL_INT_MIN + 1": - { - value: function() { return JSVAL_INT_MIN + 1; }, - type: numberType - }, - "JSVAL_INT_MAX - 1": - { - value: function() { return JSVAL_INT_MAX - 1; }, - type: numberType - }, - "JSVAL_INT_MAX": - { - value: function() { return JSVAL_INT_MAX; }, - type: numberType - }, - "JSVAL_INT_MAX + 1": - { - value: function() { return JSVAL_INT_MAX + 1; }, - type: numberType - }, - "Infinity": - { - value: function() { return Infinity; }, - type: numberType - }, - "-Infinity": - { - value: function() { return -Infinity; }, - type: numberType - }, - "NaN": - { - value: function() { return NaN; }, - type: numberType - }, - "{}": - { - value: function() { return {}; }, - type: objectType - }, - "{ valueOf: undefined }": - { - value: function() { return { valueOf: undefined }; }, - type: objectType - }, - "[]": - { - value: function() { return []; }, - type: objectType - }, - '[""]': - { - value: function() { return [""]; }, - type: objectType - }, - '["a"]': - { - value: function() { return ["a"]; }, - type: objectType - }, - "[0]": - { - value: function() { return [0]; }, - type: objectType - } - }; - - var orderOps = - { - "<": function(a, b) { return a < b; }, - ">": function(a, b) { return a > b; }, - "<=": function(a, b) { return a <= b; }, - ">=": function(a, b) { return a >= b; } - }; - var eqOps = - { - "==": function(a, b) { return a == b; }, - "!=": function(a, b) { return a != b; }, - "===": function(a, b) { return a === b; }, - "!==": function(a, b) { return a !== b; } - }; - - - var notEqualIncomparable = - { - eq: { "==": false, "!=": true, "===": false, "!==": true }, - order: { "<": false, ">": false, "<=": false, ">=": false } - }; - var notEqualLessThan = - { - eq: { "==": false, "!=": true, "===": false, "!==": true }, - order: { "<": true, ">": false, "<=": true, ">=": false } - }; - var notEqualGreaterThan = - { - eq: { "==": false, "!=": true, "===": false, "!==": true }, - order: { "<": false, ">": true, "<=": false, ">=": true } - }; - var notEqualNorDifferent = - { - eq: { "==": false, "!=": true, "===": false, "!==": true }, - order: { "<": false, ">": false, "<=": true, ">=": true } - }; - var strictlyEqual = - { - eq: { "==": true, "!=": false, "===": true, "!==": false }, - order: { "<": false, ">": false, "<=": true, ">=": true } - }; - var looselyEqual = - { - eq: { "==": true, "!=": false, "===": false, "!==": true }, - order: { "<": false, ">": false, "<=": true, ">=": true } - }; - var looselyEqualNotDifferent = - { - eq: { "==": true, "!=": false, "===": false, "!==": true }, - order: { "<": false, ">": false, "<=": true, ">=": true } - }; - var looselyEqualIncomparable = - { - eq: { "==": true, "!=": false, "===": false, "!==": true }, - order: { "<": false, ">": false, "<=": false, ">=": false } - }; - var strictlyEqualNotDifferent = - { - eq: { "==": true, "!=": false, "===": true, "!==": false }, - order: { "<": false, ">": false, "<=": true, ">=": true } - }; - var strictlyEqualIncomparable = - { - eq: { "==": true, "!=": false, "===": true, "!==": false }, - order: { "<": false, ">": false, "<=": false, ">=": false } - }; - - var comparingZeroToSomething = - { - "undefined": notEqualIncomparable, - "null": notEqualNorDifferent, - "true": notEqualLessThan, - "false": looselyEqual, - '""': looselyEqualNotDifferent, - '"a"': notEqualIncomparable, - '"Z"': notEqualIncomparable, - "0": strictlyEqual, - "-0": strictlyEqual, - "1": notEqualLessThan, - "Math.E": notEqualLessThan, - "JSVAL_INT_MIN - 1": notEqualGreaterThan, - "JSVAL_INT_MIN": notEqualGreaterThan, - "JSVAL_INT_MIN + 1": notEqualGreaterThan, - "JSVAL_INT_MAX - 1": notEqualLessThan, - "JSVAL_INT_MAX": notEqualLessThan, - "JSVAL_INT_MAX + 1": notEqualLessThan, - "Infinity": notEqualLessThan, - "-Infinity": notEqualGreaterThan, - "NaN": notEqualIncomparable, - "{}": notEqualIncomparable, - "{ valueOf: undefined }": notEqualIncomparable, - "[]": looselyEqual, - '[""]': looselyEqual, - '["a"]': notEqualIncomparable, - "[0]": looselyEqual - }; - - var comparingObjectOrObjectWithValueUndefined = - { - "undefined": notEqualIncomparable, - "null": notEqualIncomparable, - "true": notEqualIncomparable, - "false": notEqualIncomparable, - '""': notEqualGreaterThan, - '"a"': notEqualLessThan, - '"Z"': notEqualGreaterThan, - "0": notEqualIncomparable, - "-0": notEqualIncomparable, - "1": notEqualIncomparable, - "Math.E": notEqualIncomparable, - "JSVAL_INT_MIN - 1": notEqualIncomparable, - "JSVAL_INT_MIN": notEqualIncomparable, - "JSVAL_INT_MIN + 1": notEqualIncomparable, - "JSVAL_INT_MAX - 1": notEqualIncomparable, - "JSVAL_INT_MAX": notEqualIncomparable, - "JSVAL_INT_MAX + 1": notEqualIncomparable, - "Infinity": notEqualIncomparable, - "-Infinity": notEqualIncomparable, - "NaN": notEqualIncomparable, - "{}": notEqualNorDifferent, - "{ valueOf: undefined }": notEqualNorDifferent, - "[]": notEqualGreaterThan, - '[""]': notEqualGreaterThan, - '["a"]': notEqualLessThan, - "[0]": notEqualGreaterThan - }; - - // Constructed expected-value matrix - var expected = - { - "undefined": - { - "undefined": strictlyEqualIncomparable, - "null": looselyEqualIncomparable, - "true": notEqualIncomparable, - "false": notEqualIncomparable, - '""': notEqualIncomparable, - '"a"': notEqualIncomparable, - '"Z"': notEqualIncomparable, - "0": notEqualIncomparable, - "-0": notEqualIncomparable, - "1": notEqualIncomparable, - "Math.E": notEqualIncomparable, - "JSVAL_INT_MIN - 1": notEqualIncomparable, - "JSVAL_INT_MIN": notEqualIncomparable, - "JSVAL_INT_MIN + 1": notEqualIncomparable, - "JSVAL_INT_MAX - 1": notEqualIncomparable, - "JSVAL_INT_MAX": notEqualIncomparable, - "JSVAL_INT_MAX + 1": notEqualIncomparable, - "Infinity": notEqualIncomparable, - "-Infinity": notEqualIncomparable, - "NaN": notEqualIncomparable, - "{}": notEqualIncomparable, - "{ valueOf: undefined }": notEqualIncomparable, - "[]": notEqualIncomparable, - '[""]': notEqualIncomparable, - '["a"]': notEqualIncomparable, - "[0]": notEqualIncomparable - }, - "null": - { - "undefined": looselyEqualIncomparable, - "null": strictlyEqualNotDifferent, - "true": notEqualLessThan, - "false": notEqualNorDifferent, - '""': notEqualNorDifferent, - '"a"': notEqualIncomparable, - '"Z"': notEqualIncomparable, - "0": notEqualNorDifferent, - "-0": notEqualNorDifferent, - "1": notEqualLessThan, - "Math.E": notEqualLessThan, - "JSVAL_INT_MIN - 1": notEqualGreaterThan, - "JSVAL_INT_MIN": notEqualGreaterThan, - "JSVAL_INT_MIN + 1": notEqualGreaterThan, - "JSVAL_INT_MAX - 1": notEqualLessThan, - "JSVAL_INT_MAX": notEqualLessThan, - "JSVAL_INT_MAX + 1": notEqualLessThan, - "Infinity": notEqualLessThan, - "-Infinity": notEqualGreaterThan, - "NaN": notEqualIncomparable, - "{}": notEqualIncomparable, - "{ valueOf: undefined }": notEqualIncomparable, - "[]": notEqualNorDifferent, - '[""]': notEqualNorDifferent, - '["a"]': notEqualIncomparable, - "[0]": notEqualNorDifferent - }, - "true": - { - "undefined": notEqualIncomparable, - "null": notEqualGreaterThan, - "true": strictlyEqual, - "false": notEqualGreaterThan, - '""': notEqualGreaterThan, - '"a"': notEqualIncomparable, - '"Z"': notEqualIncomparable, - "0": notEqualGreaterThan, - "-0": notEqualGreaterThan, - "1": looselyEqual, - "Math.E": notEqualLessThan, - "JSVAL_INT_MIN - 1": notEqualGreaterThan, - "JSVAL_INT_MIN": notEqualGreaterThan, - "JSVAL_INT_MIN + 1": notEqualGreaterThan, - "JSVAL_INT_MAX - 1": notEqualLessThan, - "JSVAL_INT_MAX": notEqualLessThan, - "JSVAL_INT_MAX + 1": notEqualLessThan, - "Infinity": notEqualLessThan, - "-Infinity": notEqualGreaterThan, - "NaN": notEqualIncomparable, - "{}": notEqualIncomparable, - "{ valueOf: undefined }": notEqualIncomparable, - "[]": notEqualGreaterThan, - '[""]': notEqualGreaterThan, - '["a"]': notEqualIncomparable, - "[0]": notEqualGreaterThan - }, - "false": - { - "undefined": notEqualIncomparable, - "null": notEqualNorDifferent, - "true": notEqualLessThan, - "false": strictlyEqual, - '""': looselyEqualNotDifferent, - '"a"': notEqualIncomparable, - '"Z"': notEqualIncomparable, - "0": looselyEqual, - "-0": looselyEqual, - "1": notEqualLessThan, - "Math.E": notEqualLessThan, - "JSVAL_INT_MIN - 1": notEqualGreaterThan, - "JSVAL_INT_MIN": notEqualGreaterThan, - "JSVAL_INT_MIN + 1": notEqualGreaterThan, - "JSVAL_INT_MAX - 1": notEqualLessThan, - "JSVAL_INT_MAX": notEqualLessThan, - "JSVAL_INT_MAX + 1": notEqualLessThan, - "Infinity": notEqualLessThan, - "-Infinity": notEqualGreaterThan, - "NaN": notEqualIncomparable, - "{}": notEqualIncomparable, - "{ valueOf: undefined }": notEqualIncomparable, - "[]": looselyEqual, - '[""]': looselyEqual, - '["a"]': notEqualIncomparable, - "[0]": looselyEqual - }, - '""': - { - "undefined": notEqualIncomparable, - "null": notEqualNorDifferent, - "true": notEqualLessThan, - "false": looselyEqual, - '""': strictlyEqual, - '"a"': notEqualLessThan, - '"Z"': notEqualLessThan, - "0": looselyEqual, - "-0": looselyEqual, - "1": notEqualLessThan, - "Math.E": notEqualLessThan, - "JSVAL_INT_MIN - 1": notEqualGreaterThan, - "JSVAL_INT_MIN": notEqualGreaterThan, - "JSVAL_INT_MIN + 1": notEqualGreaterThan, - "JSVAL_INT_MAX - 1": notEqualLessThan, - "JSVAL_INT_MAX": notEqualLessThan, - "JSVAL_INT_MAX + 1": notEqualLessThan, - "Infinity": notEqualLessThan, - "-Infinity": notEqualGreaterThan, - "NaN": notEqualIncomparable, - "{}": notEqualLessThan, - "{ valueOf: undefined }": notEqualLessThan, - "[]": looselyEqual, - '[""]': looselyEqual, - '["a"]': notEqualLessThan, - "[0]": notEqualLessThan - }, - '"a"': - { - "undefined": notEqualIncomparable, - "null": notEqualIncomparable, - "true": notEqualIncomparable, - "false": notEqualIncomparable, - '""': notEqualGreaterThan, - '"a"': strictlyEqual, - '"Z"': notEqualGreaterThan, - "0": notEqualIncomparable, - "-0": notEqualIncomparable, - "1": notEqualIncomparable, - "Math.E": notEqualIncomparable, - "JSVAL_INT_MIN - 1": notEqualIncomparable, - "JSVAL_INT_MIN": notEqualIncomparable, - "JSVAL_INT_MIN + 1": notEqualIncomparable, - "JSVAL_INT_MAX - 1": notEqualIncomparable, - "JSVAL_INT_MAX": notEqualIncomparable, - "JSVAL_INT_MAX + 1": notEqualIncomparable, - "Infinity": notEqualIncomparable, - "-Infinity": notEqualIncomparable, - "NaN": notEqualIncomparable, - "{}": notEqualGreaterThan, - "{ valueOf: undefined }": notEqualGreaterThan, - "[]": notEqualGreaterThan, - '[""]': notEqualGreaterThan, - '["a"]': looselyEqualNotDifferent, - "[0]": notEqualGreaterThan - }, - '"Z"': - { - "undefined": notEqualIncomparable, - "null": notEqualIncomparable, - "true": notEqualIncomparable, - "false": notEqualIncomparable, - '""': notEqualGreaterThan, - '"a"': notEqualLessThan, - '"Z"': strictlyEqual, - "0": notEqualIncomparable, - "-0": notEqualIncomparable, - "1": notEqualIncomparable, - "Math.E": notEqualIncomparable, - "JSVAL_INT_MIN - 1": notEqualIncomparable, - "JSVAL_INT_MIN": notEqualIncomparable, - "JSVAL_INT_MIN + 1": notEqualIncomparable, - "JSVAL_INT_MAX - 1": notEqualIncomparable, - "JSVAL_INT_MAX": notEqualIncomparable, - "JSVAL_INT_MAX + 1": notEqualIncomparable, - "Infinity": notEqualIncomparable, - "-Infinity": notEqualIncomparable, - "NaN": notEqualIncomparable, - "{}": notEqualLessThan, - "{ valueOf: undefined }": notEqualLessThan, - "[]": notEqualGreaterThan, - '[""]': notEqualGreaterThan, - '["a"]': notEqualLessThan, - "[0]": notEqualGreaterThan - }, - "0": comparingZeroToSomething, - "-0": comparingZeroToSomething, - "1": - { - "undefined": notEqualIncomparable, - "null": notEqualGreaterThan, - "true": looselyEqual, - "false": notEqualGreaterThan, - '""': notEqualGreaterThan, - '"a"': notEqualIncomparable, - '"Z"': notEqualIncomparable, - "0": notEqualGreaterThan, - "-0": notEqualGreaterThan, - "1": strictlyEqual, - "Math.E": notEqualLessThan, - "JSVAL_INT_MIN - 1": notEqualGreaterThan, - "JSVAL_INT_MIN": notEqualGreaterThan, - "JSVAL_INT_MIN + 1": notEqualGreaterThan, - "JSVAL_INT_MAX - 1": notEqualLessThan, - "JSVAL_INT_MAX": notEqualLessThan, - "JSVAL_INT_MAX + 1": notEqualLessThan, - "Infinity": notEqualLessThan, - "-Infinity": notEqualGreaterThan, - "NaN": notEqualIncomparable, - "{}": notEqualIncomparable, - "{ valueOf: undefined }": notEqualIncomparable, - "[]": notEqualGreaterThan, - '[""]': notEqualGreaterThan, - '["a"]': notEqualIncomparable, - "[0]": notEqualGreaterThan - }, - "Math.E": - { - "undefined": notEqualIncomparable, - "null": notEqualGreaterThan, - "true": notEqualGreaterThan, - "false": notEqualGreaterThan, - '""': notEqualGreaterThan, - '"a"': notEqualIncomparable, - '"Z"': notEqualIncomparable, - "0": notEqualGreaterThan, - "-0": notEqualGreaterThan, - "1": notEqualGreaterThan, - "Math.E": strictlyEqual, - "JSVAL_INT_MIN - 1": notEqualGreaterThan, - "JSVAL_INT_MIN": notEqualGreaterThan, - "JSVAL_INT_MIN + 1": notEqualGreaterThan, - "JSVAL_INT_MAX - 1": notEqualLessThan, - "JSVAL_INT_MAX": notEqualLessThan, - "JSVAL_INT_MAX + 1": notEqualLessThan, - "Infinity": notEqualLessThan, - "-Infinity": notEqualGreaterThan, - "NaN": notEqualIncomparable, - "{}": notEqualIncomparable, - "{ valueOf: undefined }": notEqualIncomparable, - "[]": notEqualGreaterThan, - '[""]': notEqualGreaterThan, - '["a"]': notEqualIncomparable, - "[0]": notEqualGreaterThan - }, - "JSVAL_INT_MIN - 1": - { - "undefined": notEqualIncomparable, - "null": notEqualLessThan, - "true": notEqualLessThan, - "false": notEqualLessThan, - '""': notEqualLessThan, - '"a"': notEqualIncomparable, - '"Z"': notEqualIncomparable, - "0": notEqualLessThan, - "-0": notEqualLessThan, - "1": notEqualLessThan, - "Math.E": notEqualLessThan, - "JSVAL_INT_MIN - 1": strictlyEqual, - "JSVAL_INT_MIN": notEqualLessThan, - "JSVAL_INT_MIN + 1": notEqualLessThan, - "JSVAL_INT_MAX - 1": notEqualLessThan, - "JSVAL_INT_MAX": notEqualLessThan, - "JSVAL_INT_MAX + 1": notEqualLessThan, - "Infinity": notEqualLessThan, - "-Infinity": notEqualGreaterThan, - "NaN": notEqualIncomparable, - "{}": notEqualIncomparable, - "{ valueOf: undefined }": notEqualIncomparable, - "[]": notEqualLessThan, - '[""]': notEqualLessThan, - '["a"]': notEqualIncomparable, - "[0]": notEqualLessThan - }, - "JSVAL_INT_MIN": - { - "undefined": notEqualIncomparable, - "null": notEqualLessThan, - "true": notEqualLessThan, - "false": notEqualLessThan, - '""': notEqualLessThan, - '"a"': notEqualIncomparable, - '"Z"': notEqualIncomparable, - "0": notEqualLessThan, - "-0": notEqualLessThan, - "1": notEqualLessThan, - "Math.E": notEqualLessThan, - "JSVAL_INT_MIN - 1": notEqualGreaterThan, - "JSVAL_INT_MIN": strictlyEqual, - "JSVAL_INT_MIN + 1": notEqualLessThan, - "JSVAL_INT_MAX - 1": notEqualLessThan, - "JSVAL_INT_MAX": notEqualLessThan, - "JSVAL_INT_MAX + 1": notEqualLessThan, - "Infinity": notEqualLessThan, - "-Infinity": notEqualGreaterThan, - "NaN": notEqualIncomparable, - "{}": notEqualIncomparable, - "{ valueOf: undefined }": notEqualIncomparable, - "[]": notEqualLessThan, - '[""]': notEqualLessThan, - '["a"]': notEqualIncomparable, - "[0]": notEqualLessThan - }, - "JSVAL_INT_MIN + 1": - { - "undefined": notEqualIncomparable, - "null": notEqualLessThan, - "true": notEqualLessThan, - "false": notEqualLessThan, - '""': notEqualLessThan, - '"a"': notEqualIncomparable, - '"Z"': notEqualIncomparable, - "0": notEqualLessThan, - "-0": notEqualLessThan, - "1": notEqualLessThan, - "Math.E": notEqualLessThan, - "JSVAL_INT_MIN - 1": notEqualGreaterThan, - "JSVAL_INT_MIN": notEqualGreaterThan, - "JSVAL_INT_MIN + 1": strictlyEqual, - "JSVAL_INT_MAX - 1": notEqualLessThan, - "JSVAL_INT_MAX": notEqualLessThan, - "JSVAL_INT_MAX + 1": notEqualLessThan, - "Infinity": notEqualLessThan, - "-Infinity": notEqualGreaterThan, - "NaN": notEqualIncomparable, - "{}": notEqualIncomparable, - "{ valueOf: undefined }": notEqualIncomparable, - "[]": notEqualLessThan, - '[""]': notEqualLessThan, - '["a"]': notEqualIncomparable, - "[0]": notEqualLessThan - }, - "JSVAL_INT_MAX - 1": - { - "undefined": notEqualIncomparable, - "null": notEqualGreaterThan, - "true": notEqualGreaterThan, - "false": notEqualGreaterThan, - '""': notEqualGreaterThan, - '"a"': notEqualIncomparable, - '"Z"': notEqualIncomparable, - "0": notEqualGreaterThan, - "-0": notEqualGreaterThan, - "1": notEqualGreaterThan, - "Math.E": notEqualGreaterThan, - "JSVAL_INT_MIN - 1": notEqualGreaterThan, - "JSVAL_INT_MIN": notEqualGreaterThan, - "JSVAL_INT_MIN + 1": notEqualGreaterThan, - "JSVAL_INT_MAX - 1": strictlyEqual, - "JSVAL_INT_MAX": notEqualLessThan, - "JSVAL_INT_MAX + 1": notEqualLessThan, - "Infinity": notEqualLessThan, - "-Infinity": notEqualGreaterThan, - "NaN": notEqualIncomparable, - "{}": notEqualIncomparable, - "{ valueOf: undefined }": notEqualIncomparable, - "[]": notEqualGreaterThan, - '[""]': notEqualGreaterThan, - '["a"]': notEqualIncomparable, - "[0]": notEqualGreaterThan - }, - "JSVAL_INT_MAX": - { - "undefined": notEqualIncomparable, - "null": notEqualGreaterThan, - "true": notEqualGreaterThan, - "false": notEqualGreaterThan, - '""': notEqualGreaterThan, - '"a"': notEqualIncomparable, - '"Z"': notEqualIncomparable, - "0": notEqualGreaterThan, - "-0": notEqualGreaterThan, - "1": notEqualGreaterThan, - "Math.E": notEqualGreaterThan, - "JSVAL_INT_MIN - 1": notEqualGreaterThan, - "JSVAL_INT_MIN": notEqualGreaterThan, - "JSVAL_INT_MIN + 1": notEqualGreaterThan, - "JSVAL_INT_MAX - 1": notEqualGreaterThan, - "JSVAL_INT_MAX": strictlyEqual, - "JSVAL_INT_MAX + 1": notEqualLessThan, - "Infinity": notEqualLessThan, - "-Infinity": notEqualGreaterThan, - "NaN": notEqualIncomparable, - "{}": notEqualIncomparable, - "{ valueOf: undefined }": notEqualIncomparable, - "[]": notEqualGreaterThan, - '[""]': notEqualGreaterThan, - '["a"]': notEqualIncomparable, - "[0]": notEqualGreaterThan - }, - "JSVAL_INT_MAX + 1": - { - "undefined": notEqualIncomparable, - "null": notEqualGreaterThan, - "true": notEqualGreaterThan, - "false": notEqualGreaterThan, - '""': notEqualGreaterThan, - '"a"': notEqualIncomparable, - '"Z"': notEqualIncomparable, - "0": notEqualGreaterThan, - "-0": notEqualGreaterThan, - "1": notEqualGreaterThan, - "Math.E": notEqualGreaterThan, - "JSVAL_INT_MIN - 1": notEqualGreaterThan, - "JSVAL_INT_MIN": notEqualGreaterThan, - "JSVAL_INT_MIN + 1": notEqualGreaterThan, - "JSVAL_INT_MAX - 1": notEqualGreaterThan, - "JSVAL_INT_MAX": notEqualGreaterThan, - "JSVAL_INT_MAX + 1": strictlyEqual, - "Infinity": notEqualLessThan, - "-Infinity": notEqualGreaterThan, - "NaN": notEqualIncomparable, - "{}": notEqualIncomparable, - "{ valueOf: undefined }": notEqualIncomparable, - "[]": notEqualGreaterThan, - '[""]': notEqualGreaterThan, - '["a"]': notEqualIncomparable, - "[0]": notEqualGreaterThan - }, - "Infinity": - { - "undefined": notEqualIncomparable, - "null": notEqualGreaterThan, - "true": notEqualGreaterThan, - "false": notEqualGreaterThan, - '""': notEqualGreaterThan, - '"a"': notEqualIncomparable, - '"Z"': notEqualIncomparable, - "0": notEqualGreaterThan, - "-0": notEqualGreaterThan, - "1": notEqualGreaterThan, - "Math.E": notEqualGreaterThan, - "JSVAL_INT_MIN - 1": notEqualGreaterThan, - "JSVAL_INT_MIN": notEqualGreaterThan, - "JSVAL_INT_MIN + 1": notEqualGreaterThan, - "JSVAL_INT_MAX - 1": notEqualGreaterThan, - "JSVAL_INT_MAX": notEqualGreaterThan, - "JSVAL_INT_MAX + 1": notEqualGreaterThan, - "Infinity": strictlyEqual, - "-Infinity": notEqualGreaterThan, - "NaN": notEqualIncomparable, - "{}": notEqualIncomparable, - "{ valueOf: undefined }": notEqualIncomparable, - "[]": notEqualGreaterThan, - '[""]': notEqualGreaterThan, - '["a"]': notEqualIncomparable, - "[0]": notEqualGreaterThan - }, - "-Infinity": - { - "undefined": notEqualIncomparable, - "null": notEqualLessThan, - "true": notEqualLessThan, - "false": notEqualLessThan, - '""': notEqualLessThan, - '"a"': notEqualIncomparable, - '"Z"': notEqualIncomparable, - "0": notEqualLessThan, - "-0": notEqualLessThan, - "1": notEqualLessThan, - "Math.E": notEqualLessThan, - "JSVAL_INT_MIN - 1": notEqualLessThan, - "JSVAL_INT_MIN": notEqualLessThan, - "JSVAL_INT_MIN + 1": notEqualLessThan, - "JSVAL_INT_MAX - 1": notEqualLessThan, - "JSVAL_INT_MAX": notEqualLessThan, - "JSVAL_INT_MAX + 1": notEqualLessThan, - "Infinity": notEqualLessThan, - "-Infinity": strictlyEqual, - "NaN": notEqualIncomparable, - "{}": notEqualIncomparable, - "{ valueOf: undefined }": notEqualIncomparable, - "[]": notEqualLessThan, - '[""]': notEqualLessThan, - '["a"]': notEqualIncomparable, - "[0]": notEqualLessThan - }, - "NaN": - { - "undefined": notEqualIncomparable, - "null": notEqualIncomparable, - "true": notEqualIncomparable, - "false": notEqualIncomparable, - '""': notEqualIncomparable, - '"a"': notEqualIncomparable, - '"Z"': notEqualIncomparable, - "0": notEqualIncomparable, - "-0": notEqualIncomparable, - "1": notEqualIncomparable, - "Math.E": notEqualIncomparable, - "JSVAL_INT_MIN - 1": notEqualIncomparable, - "JSVAL_INT_MIN": notEqualIncomparable, - "JSVAL_INT_MIN + 1": notEqualIncomparable, - "JSVAL_INT_MAX - 1": notEqualIncomparable, - "JSVAL_INT_MAX": notEqualIncomparable, - "JSVAL_INT_MAX + 1": notEqualIncomparable, - "Infinity": notEqualIncomparable, - "-Infinity": notEqualIncomparable, - "NaN": notEqualIncomparable, - "{}": notEqualIncomparable, - "{ valueOf: undefined }": notEqualIncomparable, - "[]": notEqualIncomparable, - '[""]': notEqualIncomparable, - '["a"]': notEqualIncomparable, - "[0]": notEqualIncomparable - }, - "{}": comparingObjectOrObjectWithValueUndefined, - "{ valueOf: undefined }": comparingObjectOrObjectWithValueUndefined, - "[]": - { - "undefined": notEqualIncomparable, - "null": notEqualNorDifferent, - "true": notEqualLessThan, - "false": looselyEqual, - '""': looselyEqual, - '"a"': notEqualLessThan, - '"Z"': notEqualLessThan, - "0": looselyEqual, - "-0": looselyEqual, - "1": notEqualLessThan, - "Math.E": notEqualLessThan, - "JSVAL_INT_MIN - 1": notEqualGreaterThan, - "JSVAL_INT_MIN": notEqualGreaterThan, - "JSVAL_INT_MIN + 1": notEqualGreaterThan, - "JSVAL_INT_MAX - 1": notEqualLessThan, - "JSVAL_INT_MAX": notEqualLessThan, - "JSVAL_INT_MAX + 1": notEqualLessThan, - "Infinity": notEqualLessThan, - "-Infinity": notEqualGreaterThan, - "NaN": notEqualIncomparable, - "{}": notEqualLessThan, - "{ valueOf: undefined }": notEqualLessThan, - "[]": notEqualNorDifferent, - '[""]': notEqualNorDifferent, - '["a"]': notEqualLessThan, - "[0]": notEqualLessThan - }, - '[""]': - { - "undefined": notEqualIncomparable, - "null": notEqualNorDifferent, - "true": notEqualLessThan, - "false": looselyEqual, - '""': looselyEqual, - '"a"': notEqualLessThan, - '"Z"': notEqualLessThan, - "0": looselyEqual, - "-0": looselyEqual, - "1": notEqualLessThan, - "Math.E": notEqualLessThan, - "JSVAL_INT_MIN - 1": notEqualGreaterThan, - "JSVAL_INT_MIN": notEqualGreaterThan, - "JSVAL_INT_MIN + 1": notEqualGreaterThan, - "JSVAL_INT_MAX - 1": notEqualLessThan, - "JSVAL_INT_MAX": notEqualLessThan, - "JSVAL_INT_MAX + 1": notEqualLessThan, - "Infinity": notEqualLessThan, - "-Infinity": notEqualGreaterThan, - "NaN": notEqualIncomparable, - "{}": notEqualLessThan, - "{ valueOf: undefined }": notEqualLessThan, - "[]": notEqualNorDifferent, - '[""]': notEqualNorDifferent, - '["a"]': notEqualLessThan, - "[0]": notEqualLessThan - }, - '["a"]': - { - "undefined": notEqualIncomparable, - "null": notEqualIncomparable, - "true": notEqualIncomparable, - "false": notEqualIncomparable, - '""': notEqualGreaterThan, - '"a"': looselyEqual, - '"Z"': notEqualGreaterThan, - "0": notEqualIncomparable, - "-0": notEqualIncomparable, - "1": notEqualIncomparable, - "Math.E": notEqualIncomparable, - "JSVAL_INT_MIN - 1": notEqualIncomparable, - "JSVAL_INT_MIN": notEqualIncomparable, - "JSVAL_INT_MIN + 1": notEqualIncomparable, - "JSVAL_INT_MAX - 1": notEqualIncomparable, - "JSVAL_INT_MAX": notEqualIncomparable, - "JSVAL_INT_MAX + 1": notEqualIncomparable, - "Infinity": notEqualIncomparable, - "-Infinity": notEqualIncomparable, - "NaN": notEqualIncomparable, - "{}": notEqualGreaterThan, - "{ valueOf: undefined }": notEqualGreaterThan, - "[]": notEqualGreaterThan, - '[""]': notEqualGreaterThan, - '["a"]': notEqualNorDifferent, - "[0]": notEqualGreaterThan - }, - "[0]": - { - "undefined": notEqualIncomparable, - "null": notEqualNorDifferent, - "true": notEqualLessThan, - "false": looselyEqual, - '""': notEqualGreaterThan, - '"a"': notEqualLessThan, - '"Z"': notEqualLessThan, - "0": looselyEqual, - "-0": looselyEqual, - "1": notEqualLessThan, - "Math.E": notEqualLessThan, - "JSVAL_INT_MIN - 1": notEqualGreaterThan, - "JSVAL_INT_MIN": notEqualGreaterThan, - "JSVAL_INT_MIN + 1": notEqualGreaterThan, - "JSVAL_INT_MAX - 1": notEqualLessThan, - "JSVAL_INT_MAX": notEqualLessThan, - "JSVAL_INT_MAX + 1": notEqualLessThan, - "Infinity": notEqualLessThan, - "-Infinity": notEqualGreaterThan, - "NaN": notEqualIncomparable, - "{}": notEqualLessThan, - "{ valueOf: undefined }": notEqualLessThan, - "[]": notEqualGreaterThan, - '[""]': notEqualGreaterThan, - '["a"]': notEqualLessThan, - "[0]": notEqualNorDifferent - } - }; - - - - var failures = []; - function fail(a, ta, b, tb, ex, ac, op) - { - failures.push("(" + a + " " + op + " " + b + ") wrong: " + - "expected " + ex + ", got " + ac + - " (types " + types[ta] + ", " + types[tb] + ")"); - } - - var result = false; - for (var i in values) - { - for (var j in values) - { - // Constants, so hoist to help JIT know that - var vala = values[i], valb = values[j]; - var a = vala.value(), b = valb.value(); - - for (var opname in orderOps) - { - var op = orderOps[opname]; - var expect = expected[i][j].order[opname]; - var failed = false; - - for (var iter = 0; iter < 5; iter++) - { - result = op(a, b); - failed = failed || result !== expect; - } - - if (failed) - fail(i, vala.type, j, valb.type, expect, result, opname); - } - - for (var opname in eqOps) - { - var op = eqOps[opname]; - var expect = expected[i][j].eq[opname]; - var failed = false; - - for (var iter = 0; iter < 5; iter++) - { - result = op(a, b); - failed = failed || result !== expect; - } - - if (failed) - fail(i, vala.type, j, valb.type, expect, result, opname); - } - } - } - - if (failures.length == 0) - return "no failures reported!"; - - return "\n" + failures.join(",\n"); -} -testComparisons.expected = "no failures reported!"; -test(testComparisons); - -function testBug504520() { - // A bug involving comparisons. - var arr = [1/0, 1/0, 1/0, 1/0, 1/0, 0]; - assertEq(arr.length > RUNLOOP, true); - - var s = ''; - for (var i = 0; i < arr.length; i++) - arr[i] >= 1/0 ? null : (s += i); - assertEq(s, '5'); -} -test(testBug504520); - -function testBug504520Harder() { - // test 1024 similar cases - var vals = [1/0, -1/0, 0, 0/0]; - var ops = ["===", "!==", "==", "!=", "<", ">", "<=", ">="]; - for each (var x in vals) { - for each (var y in vals) { - for each (var op in ops) { - for each (var z in vals) { - // Assume eval is correct. This depends on the global - // Infinity property not having been reassigned. - var xz = eval(x + op + z); - var yz = eval(y + op + z); - - var arr = [x, x, x, x, x, y]; - assertEq(arr.length > RUNLOOP, true); - var expected = [xz, xz, xz, xz, xz, yz]; - - // ?: looks superfluous but that's what we're testing here - var fun = eval( - '(function (arr, results) {\n' + - ' for (let i = 0; i < arr.length; i++)\n' + - ' results.push(arr[i]' + op + z + ' ? "true" : "false");\n' + - '});\n'); - var actual = []; - fun(arr, actual); - assertEq("" + actual, "" + expected); - } - } - } - } -} -test(testBug504520Harder); - -function testCaseAbort() -{ - var four = "4"; - var r = 0; - for (var i = 0; i < 5; i++) - { - switch (i) - { - case four: r += 1; break; - default: r += 2; break; - } - } - - return "" + r; -} -testCaseAbort.expected = "10"; -testCaseAbort.jitstats = { - recorderAborted: 0 -}; -test(testCaseAbort); - -function testApplyCallHelper(f) { - var r = []; - for (var i = 0; i < 10; ++i) f.call(); - r.push(x); - for (var i = 0; i < 10; ++i) f.call(this); - r.push(x); - for (var i = 0; i < 10; ++i) f.apply(this); - r.push(x); - for (var i = 0; i < 10; ++i) f.call(this,0); - r.push(x); - for (var i = 0; i < 10; ++i) f.apply(this,[0]); - r.push(x); - for (var i = 0; i < 10; ++i) f.call(this,0,1); - r.push(x); - for (var i = 0; i < 10; ++i) f.apply(this,[0,1]); - r.push(x); - for (var i = 0; i < 10; ++i) f.call(this,0,1,2); - r.push(x); - for (var i = 0; i < 10; ++i) f.apply(this,[0,1,2]); - r.push(x); - for (var i = 0; i < 10; ++i) f.call(this,0,1,2,3); - r.push(x); - for (var i = 0; i < 10; ++i) f.apply(this,[0,1,2,3]); - r.push(x); - for (var i = 0; i < 10; ++i) f.call(this,0,1,2,3,4); - r.push(x); - for (var i = 0; i < 10; ++i) f.apply(this,[0,1,2,3,4]); - r.push(x); - for (var i = 0; i < 10; ++i) f.call(this,0,1,2,3,4,5); - r.push(x); - for (var i = 0; i < 10; ++i) f.apply(this,[0,1,2,3,4,5]) - r.push(x); - return(r.join(",")); -} -function testApplyCall() { - var r = testApplyCallHelper(function (a0,a1,a2,a3,a4,a5,a6,a7) { x = [a0,a1,a2,a3,a4,a5,a6,a7]; }); - r += testApplyCallHelper(function (a0,a1,a2,a3,a4,a5,a6,a7) { x = [a0,a1,a2,a3,a4,a5,a6,a7]; }); - return r; -} -testApplyCall.expected = -",,,,,,,,,,,,,,,,,,,,,,,,0,,,,,,,,0,,,,,,,,0,1,,,,,,,0,1,,,,,,,0,1,2,,,,,,0,1,2,,,,,,0,1,2,3,,,,,0,1,2,3,,,,,0,1,2,3,4,,,,0,1,2,3,4,,,,0,1,2,3,4,5,,,0,1,2,3,4,5,," + -",,,,,,,,,,,,,,,,,,,,,,,,0,,,,,,,,0,,,,,,,,0,1,,,,,,,0,1,,,,,,,0,1,2,,,,,,0,1,2,,,,,,0,1,2,3,,,,,0,1,2,3,,,,,0,1,2,3,4,,,,0,1,2,3,4,,,,0,1,2,3,4,5,,,0,1,2,3,4,5,,"; -test(testApplyCall); - -function testApplyUnboxHelper(f,a) { - var q; - for (var i = 0; i < 10; ++i) - q = f.apply(f,a); - return q; -} -function testApplyUnbox() { - var f = function(x) { return x; } - return [testApplyUnboxHelper(f,[1]), testApplyUnboxHelper(f,[true])].join(","); -} -testApplyUnbox.expected = "1,true"; -test(testApplyUnbox); - -function testCallPick() { - function g(x,a) { - x.f(); - } - - var x = []; - x.f = function() { } - - var y = []; - y.f = function() { } - - var z = [x,x,x,x,x,y,y,y,y,y]; - - for (var i = 0; i < 10; ++i) - g.call(this, z[i], ""); - return true; -} -testCallPick.expected = true; -test(testCallPick); - -function testInvertNullAfterNegateNull() -{ - for (var i = 0; i < 5; i++) !null; - for (var i = 0; i < 5; i++) -null; - return "no assertion"; -} -testInvertNullAfterNegateNull.expected = "no assertion"; -test(testInvertNullAfterNegateNull); - -function testUnaryImacros() -{ - function checkArg(x) - { - return 1; - } - - var o = { valueOf: checkArg, toString: null }; - var count = 0; - var v = 0; - for (var i = 0; i < 5; i++) - v += +o + -(-o); - - var results = [v === 10 ? "valueOf passed" : "valueOf failed"]; - - o.valueOf = null; - o.toString = checkArg; - - for (var i = 0; i < 5; i++) - v += +o + -(-o); - - results.push(v === 20 ? "toString passed" : "toString failed"); - - return results.join(", "); -} -testUnaryImacros.expected = "valueOf passed, toString passed"; -test(testUnaryImacros); - -function testAddAnyInconvertibleObject() -{ - var count = 0; - function toString() { ++count; if (count == 95) return {}; return "" + count; } - var o = {valueOf: undefined, toString: toString}; - - var threw = false; - try - { - for (var i = 0; i < 100; i++) - var q = 5 + o; - } - catch (e) - { - threw = true; - if (i !== 94) - return "expected i === 94, got " + i; - if (q !== "594") - return "expected q === '594', got " + q + " (type " + typeof q + ")"; - if (count !== 95) - return "expected count === 95, got " + count; - } - if (!threw) - return "expected throw with 5 + o"; // hey, a rhyme! - - return "pass"; -} -testAddAnyInconvertibleObject.expected = "pass"; -testAddAnyInconvertibleObject.jitstats = { - recorderStarted: 1, - recorderAborted: 0, - sideExitIntoInterpreter: 3 -}; -test(testAddAnyInconvertibleObject); - -function testAddInconvertibleObjectAny() -{ - var count = 0; - function toString() - { - ++count; - if (count == 95) - return {}; - return "" + count; - } - var o = {valueOf: undefined, toString: toString}; - - var threw = false; - try - { - for (var i = 0; i < 100; i++) - var q = o + 5; - } - catch (e) - { - threw = true; - if (i !== 94) - return "expected i === 94, got " + i; - if (q !== "945") - return "expected q === '945', got " + q + " (type " + typeof q + ")"; - if (count !== 95) - return "expected count === 95, got " + count; - } - if (!threw) - return "expected throw with o + 5"; - - return "pass"; -} -testAddInconvertibleObjectAny.expected = "pass"; -testAddInconvertibleObjectAny.jitstats = { - recorderStarted: 1, - recorderAborted: 0, - sideExitIntoInterpreter: 3 -}; -test(testAddInconvertibleObjectAny); - -function testAddInconvertibleObjectInconvertibleObject() -{ - var count1 = 0; - function toString1() { ++count1; if (count1 == 95) return {}; return "" + count1; } - var o1 = {valueOf: undefined, toString: toString1}; - var count2 = 0; - function toString2() { ++count2; if (count2 == 95) return {}; return "" + count2; } - var o2 = {valueOf: undefined, toString: toString2}; - - var threw = false; - try - { - for (var i = 0; i < 100; i++) - var q = o1 + o2; - } - catch (e) - { - threw = true; - if (i !== 94) - return "expected i === 94, got " + i; - if (q !== "9494") - return "expected q === '9494', got " + q + " (type " + typeof q + ")"; - if (count1 !== 95) - return "expected count1 === 95, got " + count1; - if (count2 !== 94) - return "expected count2 === 94, got " + count2; - } - if (!threw) - return "expected throw with o1 + o2"; - - return "pass"; -} -testAddInconvertibleObjectInconvertibleObject.expected = "pass"; -testAddInconvertibleObjectInconvertibleObject.jitstats = { - recorderStarted: 1, - recorderAborted: 0, - sideExitIntoInterpreter: 3 -}; -test(testAddInconvertibleObjectInconvertibleObject); - -function testBitOrAnyInconvertibleObject() -{ - var count = 0; - function toString() { ++count; if (count == 95) return {}; return count; } - var o = {valueOf: undefined, toString: toString}; - - var threw = false; - try - { - for (var i = 0; i < 100; i++) - var q = 1 | o; - } - catch (e) - { - threw = true; - if (i !== 94) - return "expected i === 94, got " + i; - if (q !== 95) - return "expected q === 95, got " + q; - if (count !== 95) - return "expected count === 95, got " + count; - } - if (!threw) - return "expected throw with 2 | o"; // hey, a rhyme! - - return "pass"; -} -testBitOrAnyInconvertibleObject.expected = "pass"; -testBitOrAnyInconvertibleObject.jitstats = { - recorderStarted: 1, - recorderAborted: 0, - sideExitIntoInterpreter: 3 -}; -test(testBitOrAnyInconvertibleObject); - -function testBitOrInconvertibleObjectAny() -{ - var count = 0; - function toString() { ++count; if (count == 95) return {}; return count; } - var o = {valueOf: undefined, toString: toString}; - - var threw = false; - try - { - for (var i = 0; i < 100; i++) - var q = o | 1; - } - catch (e) - { - threw = true; - if (i !== 94) - return "expected i === 94, got " + i; - if (q !== 95) - return "expected q === 95, got " + q; - if (count !== 95) - return "expected count === 95, got " + count; - } - if (!threw) - return "expected throw with o | 2"; - - return "pass"; -} -testBitOrInconvertibleObjectAny.expected = "pass"; -testBitOrInconvertibleObjectAny.jitstats = { - recorderStarted: 1, - recorderAborted: 0, - sideExitIntoInterpreter: 3 -}; -test(testBitOrInconvertibleObjectAny); - -function testBitOrInconvertibleObjectInconvertibleObject() -{ - var count1 = 0; - function toString1() { ++count1; if (count1 == 95) return {}; return count1; } - var o1 = {valueOf: undefined, toString: toString1}; - var count2 = 0; - function toString2() { ++count2; if (count2 == 95) return {}; return count2; } - var o2 = {valueOf: undefined, toString: toString2}; - - var threw = false; - try - { - for (var i = 0; i < 100; i++) - var q = o1 | o2; - } - catch (e) - { - threw = true; - if (i !== 94) - return "expected i === 94, got " + i; - if (q !== 94) - return "expected q === 94, got " + q; - if (count1 !== 95) - return "expected count1 === 95, got " + count1; - if (count2 !== 94) - return "expected count2 === 94, got " + count2; - } - if (!threw) - return "expected throw with o1 | o2"; - - return "pass"; -} -testBitOrInconvertibleObjectInconvertibleObject.expected = "pass"; -testBitOrInconvertibleObjectInconvertibleObject.jitstats = { - recorderStarted: 1, - recorderAborted: 0, - sideExitIntoInterpreter: 3 -}; -test(testBitOrInconvertibleObjectInconvertibleObject); - -function testCaseTypeMismatchBadness() -{ - for (var z = 0; z < 3; ++z) - { - switch ("") - { - default: - case 9: - break; - - case "": - case <x/>: - break; - } - } - - return "no crash"; -} -testCaseTypeMismatchBadness.expected = "no crash"; -testCaseTypeMismatchBadness.jitstats = { - recorderAborted: 0 -}; -test(testCaseTypeMismatchBadness); - -function testDoubleComparison() -{ - for (var i = 0; i < 500000; ++i) - { - switch (1 / 0) - { - case Infinity: - } - } - - return "finished"; -} -testDoubleComparison.expected = "finished"; -testDoubleComparison.jitstats = { - sideExitIntoInterpreter: 1 -}; -test(testDoubleComparison); - -function testLirBufOOM() -{ - var a = [ - "12345678901234", - "123456789012", - "1234567890123456789012345678", - "12345678901234567890123456789012345678901234567890123456", - "f", - "$", - "", - "f()", - "(\\*)", - "b()", - "()", - "(#)", - "ABCDEFGHIJK", - "ABCDEFGHIJKLM", - "ABCDEFGHIJKLMNOPQ", - "ABCDEFGH", - "(.)", - "(|)", - "()$", - "/()", - "(.)$" - ]; - - for (var j = 0; j < 200; ++j) { - var js = "" + j; - for (var i = 0; i < a.length; i++) - "".match(a[i] + js) - } - return "ok"; -} -testLirBufOOM.expected = "ok"; -test(testLirBufOOM); - -function testStringResolve() { - var x = 0; - for each (let d in [new String('q'), new String('q'), new String('q')]) { - if (("" + (0 in d)) === "true") - x++; - } - return x; -} -testStringResolve.expected = 3; -test(testStringResolve); - -//test no multitrees assert -function testGlobalMultitrees1() { - (function() { - for (var j = 0; j < 4; ++j) { - for each (e in ['A', 1, 'A']) { - } - } - })(); - return true; -} -testGlobalMultitrees1.expected = true; -test(testGlobalMultitrees1); - -var q = []; -for each (b in [0x3FFFFFFF, 0x3FFFFFFF, 0x3FFFFFFF]) { - for each (let e in [{}, {}, {}, "", {}]) { - b = (b | 0x40000000) + 1; - q.push(b); - } -} -function testLetWithUnstableGlobal() { - return q.join(","); -} -testLetWithUnstableGlobal.expected = "2147483648,-1073741823,-1073741822,-1073741821,-1073741820,2147483648,-1073741823,-1073741822,-1073741821,-1073741820,2147483648,-1073741823,-1073741822,-1073741821,-1073741820"; -test(testLetWithUnstableGlobal); -delete b; -delete q; - -for each (testBug474769_b in [1, 1, 1, 1.5, 1, 1]) { - (function() { for each (let testBug474769_h in [0, 0, 1.4, ""]) {} })() -} -function testBug474769() { - return testBug474769_b; -} -testBug474769.expected = 1; -test(testBug474769); - -function testReverseArgTypes() { - for (var j = 0; j < 4; ++j) ''.replace('', /x/); - return 1; -} -testReverseArgTypes.expected = 1; -test(testReverseArgTypes); - -function testBug458838() { - var a = 1; - function g() { - var b = 0 - for (var i = 0; i < 10; ++i) { - b += a; - } - return b; - } - - return g(); -} -testBug458838.expected = 10; -testBug458838.jitstats = { - recorderStarted: 1, - recorderAborted: 0, - traceCompleted: 1 -}; -test(testBug458838); - -function testInterpreterReentry() { - this.__defineSetter__('x', function(){}) - for (var j = 0; j < 5; ++j) { x = 3; } - return 1; -} -testInterpreterReentry.expected = 1; -test(testInterpreterReentry); - -function testInterpreterReentry2() { - var a = false; - var b = {}; - var c = false; - var d = {}; - this.__defineGetter__('e', function(){}); - for (let f in this) print(f); - [1 for each (g in this) for each (h in [])] - return 1; -} -testInterpreterReentry2.expected = 1; -test(testInterpreterReentry2); - -function testInterpreterReentry3() { - for (let i=0;i<5;++i) this["y" + i] = function(){}; - this.__defineGetter__('e', function (x2) { yield; }); - [1 for each (a in this) for (b in {})]; - return 1; -} -testInterpreterReentry3.expected = 1; -test(testInterpreterReentry3); - -function testInterpreterReentry4() { - var obj = {a:1, b:1, c:1, d:1, get e() 1000 }; - for (var p in obj) - obj[p]; -} -test(testInterpreterReentry4); - -function testInterpreterReentry5() { - var arr = [0, 1, 2, 3, 4]; - arr.__defineGetter__("4", function() 1000); - for (var i = 0; i < 5; i++) - arr[i]; - for (var p in arr) - arr[p]; -} -test(testInterpreterReentry5); - -function testInterpreterReentry6() { - var obj = {a:1, b:1, c:1, d:1, set e(x) { this._e = x; }}; - for (var p in obj) - obj[p] = "grue"; - return obj._e; -} -testInterpreterReentry6.expected = "grue"; -test(testInterpreterReentry6); - -function testInterpreterReentry7() { - var arr = [0, 1, 2, 3, 4]; - arr.__defineSetter__("4", function(x) { this._4 = x; }); - for (var i = 0; i < 5; i++) - arr[i] = "grue"; - var tmp = arr._4; - for (var p in arr) - arr[p] = "bleen"; - return tmp + " " + arr._4; -} -testInterpreterReentry7.expected = "grue bleen"; -test(testInterpreterReentry7); - -// Bug 462027 comment 54. -function testInterpreterReentery8() { - var e = <x><y/></x>; - for (var j = 0; j < 4; ++j) { +[e]; } -} -test(testInterpreterReentery8); - -function testHolePushing() { - var a = ["foobar", "baz"]; - for (var i = 0; i < 5; i++) - a = [, "overwritten", "new"]; - var s = "["; - for (i = 0; i < a.length; i++) { - s += (i in a) ? a[i] : "<hole>"; - if (i != a.length - 1) - s += ","; - } - return s + "], " + (0 in a); -} -testHolePushing.expected = "[<hole>,overwritten,new], false"; -test(testHolePushing); - -function testDeepBail1() { - var y = <z/>; - for (var i = 0; i < RUNLOOP; i++) - "" in y; -} -test(testDeepBail1); - -/* Array comprehension tests */ - -function Range(start, stop) { - this.i = start; - this.stop = stop; -} -Range.prototype = { - __iterator__: function() this, - next: function() { - if (this.i >= this.stop) - throw StopIteration; - return this.i++; - } -}; - -function range(start, stop) { - return new Range(start, stop); -} - -function testArrayComp1() { - return [a for (a in range(0, 10))].join(''); -} -testArrayComp1.expected='0123456789'; -test(testArrayComp1); - -function testArrayComp2() { - return [a + b for (a in range(0, 5)) for (b in range(0, 5))].join(''); -} -testArrayComp2.expected='0123412345234563456745678'; -test(testArrayComp2); - -function testSwitchUndefined() -{ - var x = undefined; - var y = 0; - for (var i = 0; i < 5; i++) - { - switch (x) - { - default: - y++; - } - } - return y; -} -testSwitchUndefined.expected = 5; -test(testSwitchUndefined); - -function testTableSwitch1() { - var x = 'miss'; - var i, j = 0; - for (i = 0; i < RUNLOOP + 10; i++) { - switch (x) { - case 1: case 2: case 3: case 4: case 5: throw "FAIL"; - default: j++; - } - } - assertEq(i, j); -} -testTableSwitch1.jitstats = { - recorderStarted: 1, - sideExitIntoInterpreter: 1, - recorderAborted: 0, - traceCompleted: 1 -}; -test(testTableSwitch1); - -function testTableSwitch2() { - var arr = [2, 2, 2, 2, 2, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5]; - var s = ''; - for (var i = 0; i < arr.length; i++) { - switch (arr[i]) { - case 0: case 1: case 3: case 4: - throw "FAIL"; - case 2: - s += '2'; - break; - case 5: - s += '5'; - } - } - assertEq(s, arr.join("")); -} -testTableSwitch2.jitstats = { - recorderStarted: 1, - sideExitIntoInterpreter: 4, - recorderAborted: 0, - traceCompleted: 3 -}; -test(testTableSwitch2); - -function testGeneratorDeepBail() { - function g() { yield 2; } - var iterables = [[1], [], [], [], g()]; - - var total = 0; - for (let i = 0; i < iterables.length; i++) - for each (let j in iterables[i]) - total += j; - return total; -} -testGeneratorDeepBail.expected = 3; -test(testGeneratorDeepBail); - -function testRegexpGet() { - var re = /hi/; - var a = []; - for (let i = 0; i < 5; ++i) - a.push(re.source); - return a.toString(); -} -testRegexpGet.expected = "hi,hi,hi,hi,hi"; -test(testRegexpGet); - -function testThrowingObjectEqUndefined() -{ - try - { - var obj = { toString: function() { throw 0; } }; - for (var i = 0; i < 5; i++) - "" + (obj == undefined); - return i === 5; - } - catch (e) - { - return "" + e; - } -} -testThrowingObjectEqUndefined.expected = true; -testThrowingObjectEqUndefined.jitstats = { - sideExitIntoInterpreter: 1 -}; -test(testThrowingObjectEqUndefined); - -function x4(v) { return "" + v + v + v + v; } -function testConvertibleObjectEqUndefined() -{ - var compares = - [ - false, false, false, false, - undefined, undefined, undefined, undefined, - false, false, false, false, - undefined, undefined, undefined, undefined, - false, false, false, false, - undefined, undefined, undefined, undefined, - false, false, false, false, - undefined, undefined, undefined, undefined, - false, false, false, false, - undefined, undefined, undefined, undefined, - ]; - var count = 0; - var obj = { valueOf: function() { count++; return 1; } }; - var results = compares.map(function(v) { return "unwritten"; }); - - for (var i = 0, sz = compares.length; i < sz; i++) - results[i] = compares[i] == obj; - - return results.join("") + count; -} -testConvertibleObjectEqUndefined.expected = - x4(false) + x4(false) + x4(false) + x4(false) + x4(false) + x4(false) + - x4(false) + x4(false) + x4(false) + x4(false) + "20"; -testConvertibleObjectEqUndefined.jitstats = { - sideExitIntoInterpreter: 3 -}; -test(testConvertibleObjectEqUndefined); - -function testUndefinedPropertyAccess() { - var x = [1,2,3]; - var y = {}; - var a = { foo: 1 }; - y.__proto__ = x; - var z = [x, x, x, y, y, y, y, a, a, a]; - var s = ""; - for (var i = 0; i < z.length; ++i) - s += z[i].foo; - return s; -} -testUndefinedPropertyAccess.expected = "undefinedundefinedundefinedundefinedundefinedundefinedundefined111"; -testUndefinedPropertyAccess.jitstats = { - traceCompleted: 3 -}; -test(testUndefinedPropertyAccess); - -q = ""; -function g() { q += "g"; } -function h() { q += "h"; } -a = [g, g, g, g, h]; -for (i=0; i<5; i++) { f = a[i]; f(); } - -function testRebranding() { - return q; -} -testRebranding.expected = "ggggh"; -test(testRebranding); -delete q; -delete g; -delete h; -delete a; -delete f; - -function testRebranding2() { - // Same as testRebranding, but the object to be rebranded isn't the global. - var x = "FAIL"; - function g(){} - function h(){ x = "ok"; } - var obj = {m: g}; - var arr = [g, g, g, g, h]; - assertEq(arr.length > RUNLOOP, true); - for (var i = 0; i < 5; i++) { - obj.m = arr[i]; - obj.m(); - } - return x; -} -testRebranding2.expected = "ok"; -test(testRebranding2); - -function testBug502914() { - // Assigning a non-function to a function-valued property on trace should - // bump the shape. - function f1() {} - function C() {} - var x = C.prototype = {m: f1}; - x.m(); // brand scope - var arr = [new C, new C, new C, x]; - try { - for (var i = 0; i < 4; i++) { - arr[i].m = 12; - x.m(); // should throw last time through - } - } catch (exc) { - return exc.constructor.name; - } - return "no exception"; -} -testBug502914.expected = "TypeError"; -test(testBug502914); - -function testLambdaCtor() { - var a = []; - for (var x = 0; x < RUNLOOP; ++x) { - var f = function(){}; - a[a.length] = new f; - } - - // This prints false until the upvar2 bug is fixed: - // print(a[HOTLOOP].__proto__ !== a[HOTLOOP-1].__proto__); - - // Assert that the last f was properly constructed. - return a[RUNLOOP-1].__proto__ === f.prototype; -} -testLambdaCtor.expected = true; -test(testLambdaCtor); - -function testNonStubGetter() { - let ([] = false) { (this.watch("x", /a/g)); }; - (function () { (eval("(function(){for each (x in [1, 2, 2]);});"))(); })(); - this.unwatch("x"); - return "ok"; -} -testNonStubGetter.expected = "ok"; -test(testNonStubGetter); - -function testString() { - var q; - for (var i = 0; i <= RUNLOOP; ++i) { - q = []; - q.push(String(void 0)); - q.push(String(true)); - q.push(String(5)); - q.push(String(5.5)); - q.push(String("5")); - q.push(String([5])); - } - return q.join(","); -} -testString.expected = "undefined,true,5,5.5,5,5"; -testString.jitstats = { - recorderStarted: 1, - sideExitIntoInterpreter: 1 -}; -test(testString); - -function testToStringBeforeValueOf() -{ - var o = {toString: function() { return "s"; }, valueOf: function() { return "v"; } }; - var a = []; - for (var i = 0; i < 10; i++) - a.push(String(o)); - return a.join(","); -} -testToStringBeforeValueOf.expected = "s,s,s,s,s,s,s,s,s,s"; -testToStringBeforeValueOf.jitstats = { - recorderStarted: 1, - sideExitIntoInterpreter: 1 -}; -test(testToStringBeforeValueOf); - -function testNullToString() -{ - var a = []; - for (var i = 0; i < 10; i++) - a.push(String(null)); - for (i = 0; i < 10; i++) { - var t = typeof a[i]; - if (t != "string") - a.push(t); - } - return a.join(","); -} -testNullToString.expected = "null,null,null,null,null,null,null,null,null,null"; -testNullToString.jitstats = { - recorderStarted: 2, - sideExitIntoInterpreter: 2, - recorderAborted: 0 -}; -test(testNullToString); - -function testAddNull() -{ - var rv; - for (var x = 0; x < HOTLOOP + 1; ++x) - rv = null + [,,]; - return rv; -} -testAddNull.expected = "null,"; -testAddNull.jitstats = { - recorderStarted: 1, - sideExitIntoInterpreter: 1, - recorderAborted: 0 -}; -test(testAddNull); - -function testClosures() -{ - function MyObject(id) { - var thisObject = this; - this.id = id; - this.toString = str; - - function str() { - return "" + this.id + thisObject.id; - } - } - - var a = []; - for (var i = 0; i < 5; i++) - a.push(new MyObject(i)); - return a.toString(); -} -testClosures.expected = "00,11,22,33,44"; -test(testClosures); - -function testMoreClosures() { - var f = {}, max = 3; - - var hello = function(n) { - function howdy() { return n * n } - f.test = howdy; - }; - - for (var i = 0; i <= max; i++) - hello(i); - - return f.test(); -} -testMoreClosures.expected = 9; -test(testMoreClosures); - -function testLambdaInitedVar() { - var jQuery = function (a, b) { - return jQuery && jQuery.length; - } - return jQuery(); -} - -testLambdaInitedVar.expected = 2; -test(testLambdaInitedVar); - -function testNestedEscapingLambdas() -{ - try { - return (function() { - var a = [], r = []; - function setTimeout(f, t) { - a.push(f); - } - - function runTimeouts() { - for (var i = 0; i < a.length; i++) - a[i](); - } - - var $foo = "#nothiddendiv"; - setTimeout(function(){ - r.push($foo); - setTimeout(function(){ - r.push($foo); - }, 100); - }, 100); - - runTimeouts(); - - return r.join(""); - })(); - } catch (e) { - return e; - } -} -testNestedEscapingLambdas.expected = "#nothiddendiv#nothiddendiv"; -test(testNestedEscapingLambdas); - -function testPropagatedFunArgs() -{ - var win = this; - var res = [], q = []; - function addEventListener(name, func, flag) { - q.push(func); - } - - var pageInfo, obs; - addEventListener("load", handleLoad, true); - - var observer = { - observe: function(win, topic, data) { - // obs.removeObserver(observer, "page-info-dialog-loaded"); - handlePageInfo(); - } - }; - - function handleLoad() { - pageInfo = { toString: function() { return "pageInfo"; } }; - obs = { addObserver: function (obs, topic, data) { obs.observe(win, topic, data); } }; - obs.addObserver(observer, "page-info-dialog-loaded", false); - } - - function handlePageInfo() { - res.push(pageInfo); - function $(aId) { res.push(pageInfo); }; - var feedTab = $("feedTab"); - } - - q[0](); - return res.join(','); -} -testPropagatedFunArgs.expected = "pageInfo,pageInfo"; -test(testPropagatedFunArgs); - -// Second testPropagatedFunArgs test -- this is a crash-test. -(function () { - var escapee; - - function testPropagatedFunArgs() - { - const magic = 42; - - var win = this; - var res = [], q = []; - function addEventListener(name, func, flag) { - q.push(func); - } - - var pageInfo = "pageInfo", obs; - addEventListener("load", handleLoad, true); - - var observer = { - observe: function(win, topic, data) { - // obs.removeObserver(observer, "page-info-dialog-loaded"); - handlePageInfo(); - } - }; - - function handleLoad() { - //pageInfo = { toString: function() { return "pageInfo"; } }; - obs = { addObserver: function (obs, topic, data) { obs.observe(win, topic, data); } }; - obs.addObserver(observer, "page-info-dialog-loaded", false); - } - - function handlePageInfo() { - res.push(pageInfo); - function $(aId) { - function notSafe() { - return magic; - } - notSafe(); - res.push(pageInfo); - }; - var feedTab = $("feedTab"); - } - - escapee = q[0]; - return res.join(','); - } - - testPropagatedFunArgs(); - - escapee(); -})(); - -function testStringLengthNoTinyId() -{ - var x = "unset"; - var t = new String(""); - for (var i = 0; i < 5; i++) - x = t["-1"]; - - var r = "t['-1'] is " + x; - t["-1"] = "foo"; - r += " when unset, '" + t["-1"] + "' when set"; - return r; -} -testStringLengthNoTinyId.expected = "t['-1'] is undefined when unset, 'foo' when set"; -test(testStringLengthNoTinyId); - -function testLengthInString() -{ - var s = new String(); - var res = "length" in s; - for (var i = 0; i < 5; i++) - res = res && ("length" in s); - res = res && s.hasOwnProperty("length"); - for (var i = 0; i < 5; i++) - res = res && s.hasOwnProperty("length"); - return res; -} -testLengthInString.expected = true; -test(testLengthInString); - -function testSlowArrayLength() -{ - var counter = 0; - var a = []; - a[10000000 - 1] = 0; - for (var i = 0; i < a.length; i++) - counter++; - return counter; -} -testSlowArrayLength.expected = 10000000; -testSlowArrayLength.jitstats = { - recorderStarted: 1, - recorderAborted: 0, - sideExitIntoInterpreter: 1 -}; -test(testSlowArrayLength); - -function testObjectLength() -{ - var counter = 0; - var a = {}; - a.length = 10000000; - for (var i = 0; i < a.length; i++) - counter++; - return counter; -} -testObjectLength.expected = 10000000; -testObjectLength.jitstats = { - recorderStarted: 1, - recorderAborted: 0, - sideExitIntoInterpreter: 1 -}; -test(testObjectLength); - -function testChangingObjectWithLength() -{ - var obj = { length: 10 }; - var dense = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; - var slow = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; slow.slow = 5; - - /* - * The elements of objs constitute a De Bruijn sequence repeated 4x to trace - * and run native code for every object and transition. - */ - var objs = [obj, obj, obj, obj, - obj, obj, obj, obj, - dense, dense, dense, dense, - obj, obj, obj, obj, - slow, slow, slow, slow, - dense, dense, dense, dense, - dense, dense, dense, dense, - slow, slow, slow, slow, - slow, slow, slow, slow, - obj, obj, obj, obj]; - - var counter = 0; - - for (var i = 0, sz = objs.length; i < sz; i++) - { - var o = objs[i]; - for (var j = 0; j < o.length; j++) - counter++; - } - - return counter; -} -testChangingObjectWithLength.expected = 400; -testChangingObjectWithLength.jitstats = { - recorderAborted: 0, - sideExitIntoInterpreter: 15 // empirically determined -}; -test(testChangingObjectWithLength); - -function testNEWINIT() -{ - var a; - for (var i = 0; i < 10; ++i) - a = [{}]; - return uneval(a); -} -testNEWINIT.expected = "[{}]"; -test(testNEWINIT); - -function testNEWINIT_DOUBLE() -{ - for (var z = 0; z < 2; ++z) { ({ 0.1: null })} - return "ok"; -} -testNEWINIT_DOUBLE.expected = "ok"; -test(testNEWINIT_DOUBLE); - -function testIntOverflow() { - // int32_max - 7 - var ival = 2147483647 - 7; - for (var i = 0; i < 30; i++) { - ival += 2; - } - return (ival < 2147483647); -} -testIntOverflow.expected = false; -testIntOverflow.jitstats = { - recorderStarted: 2, - recorderAborted: 0, - traceCompleted: 2, - traceTriggered: 2, -}; -test(testIntOverflow); - -function testIntUnderflow() { - // int32_min + 8 - var ival = -2147483648 + 8; - for (var i = 0; i < 30; i++) { - ival -= 2; - } - return (ival > -2147483648); -} -testIntUnderflow.expected = false; -testIntUnderflow.jitstats = { - recorderStarted: 2, - recorderAborted: 0, - traceCompleted: 2, - traceTriggered: 2, -}; -test(testIntUnderflow); - -function testCALLELEM() -{ - function f() { - return 5; - } - - function g() { - return 7; - } - - var x = [f,f,f,f,g]; - var y = 0; - for (var i = 0; i < 5; ++i) - y = x[i](); - return y; -} -testCALLELEM.expected = 7; -test(testCALLELEM); - -function testNewString() -{ - var o = { toString: function() { return "string"; } }; - var r = []; - for (var i = 0; i < 5; i++) - r.push(typeof new String(o)); - for (var i = 0; i < 5; i++) - r.push(typeof new String(3)); - for (var i = 0; i < 5; i++) - r.push(typeof new String(2.5)); - for (var i = 0; i < 5; i++) - r.push(typeof new String("string")); - for (var i = 0; i < 5; i++) - r.push(typeof new String(null)); - for (var i = 0; i < 5; i++) - r.push(typeof new String(true)); - for (var i = 0; i < 5; i++) - r.push(typeof new String(undefined)); - return r.length === 35 && r.every(function(v) { return v === "object"; }); -} -testNewString.expected = true; -testNewString.jitstats = { - recorderStarted: 7, - recorderAborted: 0, - traceCompleted: 7, - sideExitIntoInterpreter: 7 -}; -test(testNewString); - -function testWhileObjectOrNull() -{ - try - { - for (var i = 0; i < 3; i++) - { - var o = { p: { p: null } }; - while (o.p) - o = o.p; - } - return "pass"; - } - catch (e) - { - return "threw exception: " + e; - } -} -testWhileObjectOrNull.expected = "pass"; -test(testWhileObjectOrNull); - -function testDenseArrayProp() -{ - [].__proto__.x = 1; - ({}).__proto__.x = 2; - var a = [[],[],[],({}).__proto__]; - for (var i = 0; i < a.length; ++i) - uneval(a[i].x); - delete [].__proto__.x; - delete ({}).__proto__.x; - return "ok"; -} -testDenseArrayProp.expected = "ok"; -test(testDenseArrayProp); - -function testNewWithNonNativeProto() -{ - function f() { } - var a = f.prototype = []; - for (var i = 0; i < 5; i++) - var o = new f(); - return Object.getPrototypeOf(o) === a && o.splice === Array.prototype.splice; -} -testNewWithNonNativeProto.expected = true; -testNewWithNonNativeProto.jitstats = { - recorderStarted: 1, - recorderAborted: 0, - sideExitIntoInterpreter: 1 -}; -test(testNewWithNonNativeProto); - -function testLengthOnNonNativeProto() -{ - var o = {}; - o.__proto__ = [3]; - for (var j = 0; j < 5; j++) - o[0]; - - var o2 = {}; - o2.__proto__ = []; - for (var j = 0; j < 5; j++) - o2.length; - - function foo() { } - foo.__proto__ = []; - for (var j = 0; j < 5; j++) - foo.length; - - return "no assertion"; -} -testLengthOnNonNativeProto.expected = "no assertion"; -test(testLengthOnNonNativeProto); - -function testDeepPropertyShadowing() -{ - function h(node) { - var x = 0; - while (node) { - x++; - node = node.parent; - } - return x; - } - var tree = {__proto__: {__proto__: {parent: null}}}; - h(tree); - h(tree); - tree.parent = {}; - assertEq(h(tree), 2); -} -test(testDeepPropertyShadowing); - -// Complicated whitebox test for bug 487845. -function testGlobalShapeChangeAfterDeepBail() { - function f(name) { - this[name] = 1; // may change global shape - for (var i = 0; i < 4; i++) - ; // MonitorLoopEdge eventually triggers assertion - } - - // When i==3, deep-bail, then change global shape enough times to exhaust - // the array of GlobalStates. - var arr = [[], [], [], ["bug0", "bug1", "bug2", "bug3", "bug4"]]; - for (var i = 0; i < arr.length; i++) - arr[i].forEach(f); -} -test(testGlobalShapeChangeAfterDeepBail); -for (let i = 0; i < 5; i++) - delete this["bug" + i]; - -function testFunctionIdentityChange() -{ - function a() {} - function b() {} - - var o = { a: a, b: b }; - - for (var prop in o) - { - for (var i = 0; i < 1000; i++) - o[prop](); - } - - return true; -} -testFunctionIdentityChange.expected = true; -testFunctionIdentityChange.jitstats = { - recorderStarted: 2, - traceCompleted: 2, - sideExitIntoInterpreter: 3 -}; -test(testFunctionIdentityChange); - -function testStringObjectLength() { - var x = new String("foo"), y = 0; - for (var i = 0; i < 10; ++i) - y = x.length; - return y; -} -testStringObjectLength.expected = 3; -test(testStringObjectLength); - -var _quit; -function testNestedDeepBail() -{ - _quit = false; - function loop() { - for (var i = 0; i < 4; i++) - ; - } - loop(); - - function f() { - loop(); - _quit = true; - } - var stk = [[1], [], [], [], []]; - while (!_quit) - stk.pop().forEach(f); -} -test(testNestedDeepBail); -delete _quit; - -function testSlowNativeCtor() { - for (var i = 0; i < 4; i++) - new Date().valueOf(); -} -test(testSlowNativeCtor); - -function testSlowNativeBail() { - var a = ['0', '1', '2', '3', '+']; - try { - for (var i = 0; i < a.length; i++) - new RegExp(a[i]); - } catch (exc) { - assertEq(""+exc.stack.match(/^RegExp/), "RegExp"); - } -} -test(testSlowNativeBail); - -/* Test the proper operation of the left shift operator. This is especially - * important on ARM as an explicit mask is required at the native instruction - * level. */ -function testShiftLeft() -{ - var r = []; - var i = 0; - var j = 0; - - var shifts = [0,1,7,8,15,16,23,24,31]; - - /* Samples from the simple shift range. */ - for (i = 0; i < shifts.length; i++) - r[j++] = 1 << shifts[i]; - - /* Samples outside the normal shift range. */ - for (i = 0; i < shifts.length; i++) - r[j++] = 1 << (shifts[i] + 32); - - /* Samples far outside the normal shift range. */ - for (i = 0; i < shifts.length; i++) - r[j++] = 1 << (shifts[i] + 224); - for (i = 0; i < shifts.length; i++) - r[j++] = 1 << (shifts[i] + 256); - - return r.join(","); -} -testShiftLeft.expected = - "1,2,128,256,32768,65536,8388608,16777216,-2147483648,"+ - "1,2,128,256,32768,65536,8388608,16777216,-2147483648,"+ - "1,2,128,256,32768,65536,8388608,16777216,-2147483648,"+ - "1,2,128,256,32768,65536,8388608,16777216,-2147483648"; -test(testShiftLeft); - -/* Test the proper operation of the logical right shift operator. This is - * especially important on ARM as an explicit mask is required at the native - * instruction level. */ -function testShiftRightLogical() -{ - var r = []; - var i = 0; - var j = 0; - - var shifts = [0,1,7,8,15,16,23,24,31]; - - /* Samples from the simple shift range. */ - for (i = 0; i < shifts.length; i++) - r[j++] = -2147483648 >>> shifts[i]; - - /* Samples outside the normal shift range. */ - for (i = 0; i < shifts.length; i++) - r[j++] = -2147483648 >>> (shifts[i] + 32); - - /* Samples far outside the normal shift range. */ - for (i = 0; i < shifts.length; i++) - r[j++] = -2147483648 >>> (shifts[i] + 224); - for (i = 0; i < shifts.length; i++) - r[j++] = -2147483648 >>> (shifts[i] + 256); - - return r.join(","); -} -/* Note: Arguments to the ">>>" operator are converted to unsigned 32-bit - * integers during evaluation. As a result, -2147483648 >>> 0 evaluates to the - * unsigned interpretation of the same value, which is 2147483648. */ -testShiftRightLogical.expected = - "2147483648,1073741824,16777216,8388608,65536,32768,256,128,1,"+ - "2147483648,1073741824,16777216,8388608,65536,32768,256,128,1,"+ - "2147483648,1073741824,16777216,8388608,65536,32768,256,128,1,"+ - "2147483648,1073741824,16777216,8388608,65536,32768,256,128,1"; -test(testShiftRightLogical); - -/* Test the proper operation of the arithmetic right shift operator. This is - * especially important on ARM as an explicit mask is required at the native - * instruction level. */ -function testShiftRightArithmetic() -{ - var r = []; - var i = 0; - var j = 0; - - var shifts = [0,1,7,8,15,16,23,24,31]; - - /* Samples from the simple shift range. */ - for (i = 0; i < shifts.length; i++) - r[j++] = -2147483648 >> shifts[i]; - - /* Samples outside the normal shift range. */ - for (i = 0; i < shifts.length; i++) - r[j++] = -2147483648 >> (shifts[i] + 32); - - /* Samples far outside the normal shift range. */ - for (i = 0; i < shifts.length; i++) - r[j++] = -2147483648 >> (shifts[i] + 224); - for (i = 0; i < shifts.length; i++) - r[j++] = -2147483648 >> (shifts[i] + 256); - - return r.join(","); -} -testShiftRightArithmetic.expected = - "-2147483648,-1073741824,-16777216,-8388608,-65536,-32768,-256,-128,-1,"+ - "-2147483648,-1073741824,-16777216,-8388608,-65536,-32768,-256,-128,-1,"+ - "-2147483648,-1073741824,-16777216,-8388608,-65536,-32768,-256,-128,-1,"+ - "-2147483648,-1073741824,-16777216,-8388608,-65536,-32768,-256,-128,-1"; -test(testShiftRightArithmetic); - -function testStringConstructorWithExtraArg() { - for (let i = 0; i < 5; ++i) - new String(new String(), 2); - return "ok"; -} -testStringConstructorWithExtraArg.expected = "ok"; -test(testStringConstructorWithExtraArg); - -function testConstructorBail() { - for (let i = 0; i < 5; ++i) new Number(/x/); -} -test(testConstructorBail); - -function testNewArrayCount() -{ - var a = []; - for (var i = 0; i < 5; i++) - a = [0]; - assertEq(a.__count__, 1); - for (var i = 0; i < 5; i++) - a = [0, , 2]; - assertEq(a.__count__, 2); -} -test(testNewArrayCount); - -function testNewArrayCount2() { - var x = 0; - for (var i = 0; i < 10; ++i) - x = new Array(1,2,3).__count__; - return x; -} -testNewArrayCount2.expected = 3; -test(testNewArrayCount2); - -function testGetCallObjInlined(i) { - if (i > 7) eval("1"); - return 1; -} - -function testGetCallObj() { - for (var i = 0; i < 10; ++i) - testGetCallObjInlined(i); - return "ok"; -} -testGetCallObj.expected = "ok"; -test(testGetCallObj); - -function testGetThis() { - for (var i = 0; i < 3; ++i) { - (function() { return this; })(); - } - return "ok"; -} -testGetThis.expected = "ok"; -test(testGetThis); - -function testArrayNamedProp() { - for (var x = 0; x < 10; ++x) { [4].sort-- } - return "ok"; -} -testArrayNamedProp.expected = "ok"; -test(testArrayNamedProp); - -function testUndemoteLateGlobalSlots() { - for each (aaa in ["", "", 0/0, ""]) { - ++aaa; - for each (bbb in [0, "", aaa, "", 0, "", 0/0]) { - } - } - delete aaa; - delete bbb; - return "ok"; -} -testUndemoteLateGlobalSlots.expected = "ok"; -test(testUndemoteLateGlobalSlots); - -function testSetProtoRegeneratesObjectShape() -{ - var f = function() {}; - var g = function() {}; - g.prototype.__proto__ = {}; - - function iq(obj) - { - for (var i = 0; i < 10; ++i) - "" + obj.prototype; - } - - iq(f); - iq(f); - iq(f); - iq(f); - iq(g); - - if (shapeOf(f.prototype) === shapeOf(g.prototype)) - return "object shapes same after proto of one is changed"; - - return true; -} -testSetProtoRegeneratesObjectShape.expected = true; -test(testSetProtoRegeneratesObjectShape); - -function testFewerGlobalsInInnerTree() { - for each (a in [new Number(1), new Number(1), {}, {}, new Number(1)]) { - for each (b in [2, "", 2, "", "", ""]) { - for each (c in [{}, {}, 3, 3, 3, 3, {}, {}]) { - 4 + a; - } - } - } - delete a; - delete b; - delete c; - return "ok"; -} -testFewerGlobalsInInnerTree.expected = "ok"; -test(testFewerGlobalsInInnerTree); - -function testMethodInit() { // bug 503198 - function o() { return 'o'; } - function k() { return 'k'; } - - var x; - for (var i = 0; i < 10; i++) - x = {o: o, k: k}; - return x.o() + x.k(); -} -testMethodInit.expected = "ok"; -testMethodInit.jitstats = { - recorderStarted: 1, - traceCompleted: 1, - sideExitIntoInterpreter: 1 -}; -test(testMethodInit); - -function testMethodSet() { // bug 503198 - function o() { return 'o'; } - function k() { return 'k'; } - - var x; - for (var i = 0; i < 10; i++) { - x = {}; - x.o = o; - x.k = k; - } - return x.o() + x.k(); -} -testMethodSet.expected = "ok"; -testMethodSet.jitstats = { - recorderStarted: 1, - traceCompleted: 1, - sideExitIntoInterpreter: 1 -}; -test(testMethodSet); - -function testMethodInitSafety() { - function f() { return 'fail'; } - function g() { return 'ok'; } - - var s; - var arr = [f, f, f, f, g]; - assertEq(arr.length > RUNLOOP, true); - for (var i = 0; i < arr.length; i++) { - var x = {m: arr[i]}; - s = x.m(); - } - return s; -} -testMethodInitSafety.expected = "ok"; -test(testMethodInitSafety); - -function testModuloWithNegative1() { - var v = 0; - for (var i = 0; i < 2; ++i) { - c = v; - v -= 1; - for (var j = 0; j < 2; ++j) - c %= -1; - } - return 1/c; -} -testModuloWithNegative1.expected = -Infinity; -test(testModuloWithNegative1); - -function testDivisionWithNegative1() { - for (var i = 3; i >= 0; --i) - c = i / -1; - return 1/c; -} -testDivisionWithNegative1.expected = -Infinity; -test(testDivisionWithNegative1); - -function testInt32ToId() -{ - // Ensure that a property which is a negative integer that does not fit in a - // jsval is properly detected by the 'in' operator. - var obj = { "-1073741828": 17 }; - var index = -1073741819; - var a = []; - for (var i = 0; i < 10; i++) - { - a.push(index in obj); - index--; - } - - // Ensure that a property which is a negative integer that does not fit in a - // jsval is properly *not* detected by the 'in' operator. In this case - // wrongly applying INT_TO_JSID to -2147483648 will shift off the sign bit - // (the only bit set in that number) and bitwise-or that value with 1, - // producing jsid(1) -- which actually represents "0", not "-2147483648". - // Thus 'in' will report a "-2147483648" property when none exists, because - // it thinks the request was really whether the object had property "0". - var obj2 = { 0: 17 }; - var b = []; - var index = -(1 << 28); - for (var i = 0; i < 10; i++) - { - b.push(index in obj2); - index = index - (1 << 28); - } - - return a.join(",") + b.join(","); -} -testInt32ToId.expected = - "false,false,false,false,false,false,false,false,false,true" + - "false,false,false,false,false,false,false,false,false,false"; -testInt32ToId.jitstats = { - sideExitIntoInterpreter: 2 -}; -test(testInt32ToId); - -function testOwnPropertyWithInOperator() -{ - var o = { 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6 }; - var a = []; - for (var i = 0; i < 7; i++) - a.push(i in o); - return a.join(","); -} -testOwnPropertyWithInOperator.expected = "true,true,true,true,true,true,true"; -testOwnPropertyWithInOperator.jitstats = { - sideExitIntoInterpreter: 1 -}; -test(testOwnPropertyWithInOperator); - -function testBug501690() { - // Property cache assertion when 3 objects along a prototype chain have the same shape. - function B(){} - B.prototype = {x: 123}; - - function D(){} - D.prototype = new B; - D.prototype.x = 1; // [1] shapeOf(B.prototype) == shapeOf(D.prototype) - - arr = [new D, new D, new D, D.prototype]; // [2] all the same shape - for (var i = 0; i < 4; i++) - assertEq(arr[i].x, 1); // same kshape [2], same vshape [1] -} -test(testBug501690); - -function testObjectVsPrototype() { - function D() {} - var b = D.prototype = {x: 1}; - var d = new D; - var arr = [b, b, b, d]; - for (var i = 0; i < 4; i++) - arr[i].x = i; - - d.y = 12; - assertEq(d.x, 3); -} -test(testObjectVsPrototype); - -function testEliminatedGuardWithinAnchor() { - for (let i = 0; i < 5; ++i) { i / (i * i); } - return "ok"; -} -testEliminatedGuardWithinAnchor.expected = "ok"; -testOwnPropertyWithInOperator.jitstats = { - sideExitIntoInterpreter: 3 -}; -test(testEliminatedGuardWithinAnchor); - -function testNativeSetter() { - var re = /foo/; - var N = RUNLOOP + 10; - for (var i = 0; i < N; i++) - re.lastIndex = i; - assertEq(re.lastIndex, N - 1); -} -testNativeSetter.jitstats = { - recorderStarted: 1, - recorderAborted: 0, - traceTriggered: 1, - sideExitIntoInterpreter: 1 -}; -test(testNativeSetter); - -function testBug507425() { - var r = /x/; - for (var i = 0; i < 3; i++) - r.lastIndex = 0; // call a setter - var s = ';'; - try { - for (i = 0; i < 80; i++) - s += s; // call js_CanLeaveTrace - } catch (exc) { - return "ok"; - } -} -testBug507425.expected = "ok"; -test(testBug507425); - -/***************************************************************************** - * * - * _____ _ _ _____ ______ _____ _______ * - * |_ _| \ | |/ ____| ____| __ \__ __| * - * | | | \| | (___ | |__ | |__) | | | * - * | | | . ` |\___ \| __| | _ / | | * - * _| |_| |\ |____) | |____| | \ \ | | * - * |_____|_| \_|_____/|______|_| \_\ |_| * - * * - * * - * _______ ______ _____ _______ _____ * - * |__ __| ____|/ ____|__ __/ ____| * - * | | | |__ | (___ | | | (___ * - * | | | __| \___ \ | | \___ \ * - * | | | |____ ____) | | | ____) | * - * |_| |______|_____/ |_| |_____/ * - * * - * * - * ____ ______ ______ ____ _____ ______ _ _ ______ _____ ______ * - * | _ \| ____| ____/ __ \| __ \| ____| | | | | ____| __ \| ____| * - * | |_) | |__ | |__ | | | | |__) | |__ | |__| | |__ | |__) | |__ * - * | _ <| __| | __|| | | | _ /| __| | __ | __| | _ /| __| * - * | |_) | |____| | | |__| | | \ \| |____ | | | | |____| | \ \| |____ * - * |____/|______|_| \____/|_| \_\______| |_| |_|______|_| \_\______| * - * * - *****************************************************************************/ - -load(gSrcdir + "/math-trace-tests.js"); - -// BEGIN MANDELBROT STUFF -// XXXbz I would dearly like to wrap it up into a function to avoid polluting -// the global scope, but the function ends up heavyweight, and then we lose on -// the jit. -if (gDoMandelbrotTest) { -load(gSrcdir + "/mandelbrot-results.js"); -//function testMandelbrotAll() { - // Configuration options that affect which codepaths we follow. - var doImageData = true; - var avoidSparseArray = true; - - // Control of iteration numbers and sizing. We'll do - // scaler * colorNames.length iterations or so before deciding that we - // don't escape. - const scaler = 5; - const numRows = 600; - const numCols = 600; - - const colorNames = [ - "black", - "green", - "blue", - "red", - "purple", - "orange", - "cyan", - "yellow", - "magenta", - "brown", - "pink", - "chartreuse", - "darkorange", - "crimson", - "gray", - "deeppink", - "firebrick", - "lavender", - "lawngreen", - "lightsalmon", - "lime", - "goldenrod" - ]; - const threshold = (colorNames.length - 1) * scaler; - - // Now set up our colors - var colors = []; - // 3-part for loop (iterators buggy, we will add a separate test for them) - for (var colorNameIdx = 0; colorNameIdx < colorNames.length; ++colorNameIdx) { - //for (var colorNameIdx in colorNames) { - colorNameIdx = parseInt(colorNameIdx); - colors.push([colorNameIdx, colorNameIdx, colorNameIdx, 0]); - } - - // Storage for our point data - var points; - - var scratch = {}; - var scratchZ = {}; - function complexMult(a, b) { - var newr = a.r * b.r - a.i * b.i; - var newi = a.r * b.i + a.i * b.r; - scratch.r = newr; - scratch.i = newi; - return scratch; - } - function complexAdd(a, b) { - scratch.r = a.r + b.r; - scratch.i = a.i + b.i; - return scratch; - } - function abs(a) { - return Math.sqrt(a.r * a.r + a.i * a.i); - } - - function escapeAbsDiff(normZ, absC) { - var absZ = Math.sqrt(normZ); - return normZ > absZ + absC; - } - - function escapeNorm2(normZ) { - return normZ > 4; - } - - function fuzzyColors(i) { - return Math.floor(i / scaler) + 1; - } - - function moddedColors(i) { - return (i % (colorNames.length - 1)) + 1; - } - - function computeEscapeSpeedObjects(real, imag) { - var c = { r: real, i: imag } - scratchZ.r = scratchZ.i = 0; - var absC = abs(c); - for (var i = 0; i < threshold; ++i) { - scratchZ = complexAdd(c, complexMult(scratchZ, scratchZ)); - if (escape(scratchZ.r * scratchZ.r + scratchZ.i * scratchZ.i, - absC)) { - return colorMap(i); - } - } - return 0; - } - - function computeEscapeSpeedOneObject(real, imag) { - // fold in the fact that we start with 0 - var r = real; - var i = imag; - var absC = abs({r: real, i: imag}); - for (var j = 0; j < threshold; ++j) { - var r2 = r * r; - var i2 = i * i; - if (escape(r2 + i2, absC)) { - return colorMap(j); - } - i = 2 * r * i + imag; - r = r2 - i2 + real; - } - return 0; - } - - function computeEscapeSpeedDoubles(real, imag) { - // fold in the fact that we start with 0 - var r = real; - var i = imag; - var absC = Math.sqrt(real * real + imag * imag); - for (var j = 0; j < threshold; ++j) { - var r2 = r * r; - var i2 = i * i; - if (escape(r2 + i2, absC)) { - return colorMap(j); - } - i = 2 * r * i + imag; - r = r2 - i2 + real; - } - return 0; - } - - var computeEscapeSpeed = computeEscapeSpeedDoubles; - var escape = escapeNorm2; - var colorMap = fuzzyColors; - - function addPointOrig(pointArray, n, i, j) { - if (!points[n]) { - points[n] = []; - points[n].push([i, j, 1, 1]); - } else { - var point = points[n][points[n].length-1]; - if (point[0] == i && point[1] == j - point[3]) { - ++point[3]; - } else { - points[n].push([i, j, 1, 1]); - } - } - } - - function addPointImagedata(pointArray, n, col, row) { - var slotIdx = ((row * numCols) + col) * 4; - pointArray[slotIdx] = colors[n][0]; - pointArray[slotIdx+1] = colors[n][1]; - pointArray[slotIdx+2] = colors[n][2]; - pointArray[slotIdx+3] = colors[n][3]; - } - - function createMandelSet() { - var realRange = { min: -2.1, max: 1 }; - var imagRange = { min: -1.5, max: 1.5 }; - - var addPoint; - if (doImageData) { - addPoint = addPointImagedata; - points = new Array(4*numCols*numRows); - if (avoidSparseArray) { - for (var idx = 0; idx < 4*numCols*numRows; ++idx) { - points[idx] = 0; - } - } - } else { - addPoint = addPointOrig; - points = []; - } - var realStep = (realRange.max - realRange.min)/numCols; - var imagStep = (imagRange.min - imagRange.max)/numRows; - for (var i = 0, curReal = realRange.min; - i < numCols; - ++i, curReal += realStep) { - for (var j = 0, curImag = imagRange.max; - j < numRows; - ++j, curImag += imagStep) { - var n = computeEscapeSpeed(curReal, curImag); - addPoint(points, n, i, j) - } - } - var result; - if (doImageData) { - if (colorMap == fuzzyColors) { - result = mandelbrotImageDataFuzzyResult; - } else { - result = mandelbrotImageDataModdedResult; - } - } else { - result = mandelbrotNoImageDataResult; - } - return points.toSource() == result; - } - - createMandelSet.expected = true; - - const escapeTests = [ escapeAbsDiff ]; - const colorMaps = [ fuzzyColors, moddedColors ]; - const escapeComputations = [ computeEscapeSpeedObjects, - computeEscapeSpeedOneObject, - computeEscapeSpeedDoubles ]; - // Test all possible escape-speed generation codepaths, using the - // imageData + sparse array avoidance storage. - doImageData = true; - avoidSparseArray = true; - for (var escapeIdx in escapeTests) { - escape = escapeTests[escapeIdx]; - for (var colorMapIdx in colorMaps) { - colorMap = colorMaps[colorMapIdx]; - for (var escapeComputationIdx in escapeComputations) { - computeEscapeSpeed = escapeComputations[escapeComputationIdx]; - test(createMandelSet); - } - } - } - - // Test all possible storage strategies. Note that we already tested - // doImageData == true with avoidSparseArray == true. - escape = escapeAbsDiff; - colorMap = fuzzyColors; // This part doesn't really matter too much here - computeEscapeSpeed = computeEscapeSpeedDoubles; - - doImageData = true; - avoidSparseArray = false; - test(createMandelSet); - - escape = escapeNorm2; - doImageData = false; // avoidSparseArray doesn't matter here - test(createMandelSet); -//} -//testMandelbrotAll(); -} /* if (gDoMandelbrotTest) */ -// END MANDELBROT STUFF - -/***************************************************************************** - * _ _ ____ _ __ ____ _____ ______ * - * | \ | |/ __ \ | \/ |/ __ \| __ \| ____| * - * | \| | | | | | \ / | | | | |__) | |__ * - * | . ` | | | | | |\/| | | | | _ /| __| * - * | |\ | |__| | | | | | |__| | | \ \| |____ * - * |_| \_|\____/ |_| |_|\____/|_| \_\______| * - * * - * _______ ______ _____ _______ _____ * - * |__ __| ____|/ ____|__ __/ ____| * - * | | | |__ | (___ | | | (___ * - * | | | __| \___ \ | | \___ \ * - * | | | |____ ____) | | | ____) | * - * |_| |______|_____/ |_| |_____/ * - * * - * ______ _______ ______ _____ _ _ ______ _____ ______ _ * - * /\ | ____|__ __| ____| __ \ | | | | ____| __ \| ____| | * - * / \ | |__ | | | |__ | |__) | | |__| | |__ | |__) | |__ | | * - * / /\ \ | __| | | | __| | _ / | __ | __| | _ /| __| | | * - * / ____ \| | | | | |____| | \ \ | | | | |____| | \ \| |____|_| * - * /_/ \_\_| |_| |______|_| \_\ |_| |_|______|_| \_\______(_) * - * * - *****************************************************************************/ - -/* NOTE: Keep this test last, since it screws up all for...in loops after it. */ -function testGlobalProtoAccess() { - return "ok"; -} -this.__proto__.a = 3; for (var j = 0; j < 4; ++j) { [a]; } -testGlobalProtoAccess.expected = "ok"; -test(testGlobalProtoAccess); - -/* Keep these at the end so that we can see the summary after the trace-debug spew. */ -if (gReportSummary) { - print("\npassed:", passes.length && passes.join(",")); - print("\nFAILED:", fails.length && fails.join(",")); -} |