setJitCompilerOption("baseline.warmup.trigger", 10); setJitCompilerOption("ion.warmup.trigger", 30); var i; // Check that an entry frame is always aligned properly. function entryFrame_1() { assertJitStackInvariants(); } // Check rectifier frames are keeping the same alignment. function rectifierFrame_verify(a, b, c, d) { assertJitStackInvariants(); } function rectifierFrame_1(i) { rectifierFrame_verify(); } function rectifierFrame_2(i) { rectifierFrame_verify(i); } function rectifierFrame_3(i) { rectifierFrame_verify(i, i); } function rectifierFrame_4(i) { rectifierFrame_verify(i, i, i); } // Check that an ion frame size is always aligned properly. function gen_ionFrameSize(x, y, name) { var locals = (new Array(x)).fill(0).map((v, i) => i); var args = (new Array(y)).fill(0).map((v, i) => i); return new Function("i", locals.map(i => "var l% = i + %;\n".replace(/%/g, i)).join("") + name + "(" + args.map(i => "l%".replace("%", i)).join(", ") + ");\n" + "return " + locals.map(i => "l%".replace("%", i)).join(" + ") + ";\n" ); } var ionFrameSize_0 = gen_ionFrameSize(30, 0, "assertJitStackInvariants"); var ionFrameSize_1 = gen_ionFrameSize(31, 0, "assertJitStackInvariants"); var ionFrameSize_2 = gen_ionFrameSize(32, 0, "assertJitStackInvariants"); var ionFrameSize_3 = gen_ionFrameSize(33, 0, "assertJitStackInvariants"); function ionFrameSize_callee_verify(a, b, c, d) { assertJitStackInvariants(); } var ionFrameSize_args = []; for (var l = 0; l < 4; l++) { ionFrameSize_args[l] = []; for (var a = 0; a < 4; a++) ionFrameSize_args[l][a] = gen_ionFrameSize(30 + l, a, "ionFrameSize_callee_verify");; } // Check ion frames during function apply calls with the argument vector. function ionFrame_funApply_0() { assertJitStackInvariants.apply(this, arguments); } function ionFrame_funApply_1() { ionFrame_funApply_0.apply(this, arguments); } // Check ion frames during function apply calls with an array of arguments. function ionFrame_funApply_2() { var arr = Array.apply(Array, arguments); assertJitStackInvariants.apply(this, arr); } function ionFrame_funApply_3() { var arr = Array.apply(Array, arguments); ionFrame_funApply_2.apply(this, arr); } // Check ion frames during function .call calls. function ionFrame_funCall_0() { assertJitStackInvariants.call(this); } function ionFrame_funCall_1(a) { assertJitStackInvariants.call(this, a); } function ionFrame_funCall_2(a, b) { assertJitStackInvariants.call(this, a, b); } function ionFrame_funCall_3(a, b, c) { assertJitStackInvariants.call(this, a, b, c); } function ionFrame_funCall_x0() { ionFrame_funCall_0.call(this); } function ionFrame_funCall_x1(a) { ionFrame_funCall_1.call(this, a); } function ionFrame_funCall_x2(a, b) { ionFrame_funCall_2.call(this, a, b); } function ionFrame_funCall_x3(a, b, c) { ionFrame_funCall_3.call(this, a, b, c); } // Check ion frames during spread calls. function ionFrame_spreadCall_0() { var arr = Array.apply(Array, arguments); assertJitStackInvariants(...arr); } function ionFrame_spreadCall_1() { var arr = Array.apply(Array, arguments); ionFrame_spreadCall_0(...arr); } for (i = 0; i < 40; i++) { entryFrame_1(); entryFrame_1(0); entryFrame_1(0, 1); rectifierFrame_1(i); rectifierFrame_2(i); rectifierFrame_3(i); rectifierFrame_4(i); ionFrameSize_0(i); ionFrameSize_1(i); ionFrameSize_2(i); ionFrameSize_3(i); for (var l = 0; l < 4; l++) for (var a = 0; a < 4; a++) ionFrameSize_args[l][a](i); ionFrame_funApply_0(); ionFrame_funApply_0(1); ionFrame_funApply_0(1, 2); ionFrame_funApply_0(1, 2, 3); ionFrame_funApply_1(); ionFrame_funApply_1(1); ionFrame_funApply_1(1, 2); ionFrame_funApply_1(1, 2, 3); ionFrame_funApply_2(); ionFrame_funApply_2(1); ionFrame_funApply_2(1, 2); ionFrame_funApply_2(1, 2, 3); ionFrame_funApply_3(); ionFrame_funApply_3(1); ionFrame_funApply_3(1, 2); ionFrame_funApply_3(1, 2, 3); ionFrame_funCall_0(); ionFrame_funCall_1(1); ionFrame_funCall_2(1, 2); ionFrame_funCall_3(1, 2, 3); ionFrame_funCall_x0(); ionFrame_funCall_x1(1); ionFrame_funCall_x2(1, 2); ionFrame_funCall_x3(1, 2, 3); ionFrame_spreadCall_0(); ionFrame_spreadCall_0(1); ionFrame_spreadCall_0(1, 2); ionFrame_spreadCall_0(1, 2, 3); ionFrame_spreadCall_1(); ionFrame_spreadCall_1(1); ionFrame_spreadCall_1(1, 2); ionFrame_spreadCall_1(1, 2, 3); }