| <p>This tests verifies access to captured arguments via an optimized-away arguments object. |
| </p> |
| <pre id="console"></pre> |
| |
| <script> |
| function log(s) |
| { |
| document.getElementById("console").appendChild(document.createTextNode(s + "\r\n")); |
| } |
| |
| function shouldBe(a, aDescription, b, printSuccess) |
| { |
| if (a == b) { |
| if (printSuccess) |
| log("PASS: " + aDescription + " should be " + b + " and is."); |
| return; |
| } |
| log("FAIL: " + aDescription + " should be " + b + " but instead is " + a + "."); |
| } |
| |
| if (window.testRunner) { |
| testRunner.dumpAsText(); |
| } |
| |
| // In-bounds of declared and passed arguments, no activation, before tear-off. |
| function f0(x) { |
| return arguments[0] || function() { return x; }; |
| } |
| |
| // Out-of-bounds of declared arguments, in-bounds of passed arguments, no activation, before tear-off. |
| function f1(x) { |
| return arguments[1] || function() { return x; }; |
| } |
| |
| // In-bounds of declared arguments, in-bounds of passed arguments, yes activation, before tear-off. |
| function f2(x) { |
| return function() { return x; } && arguments[0]; |
| } |
| |
| // Out-of-bounds of declared arguments, in-bounds of passed arguments, yes activation, before tear-off. |
| function f3(x) { |
| return function() { return x; } && arguments[1]; |
| } |
| |
| // In-bounds of declared and passed arguments, no activation, after tear-off. |
| function f4(x) { |
| return arguments || function() { return x; }; |
| } |
| |
| // Out-of-bounds of declared arguments, in-bounds of passed arguments, no activation, after tear-off. |
| function f5(x) { |
| return arguments || function() { return x; }; |
| } |
| |
| // In-bounds of declared arguments, in-bounds of passed arguments, yes activation, after tear-off. |
| function f6(x) { |
| return function() { return x; } && arguments; |
| } |
| |
| // Out-of-bounds of declared arguments, in-bounds of passed arguments, yes activation, after tear-off. |
| function f7(x) { |
| return function() { return x; } && arguments; |
| } |
| |
| function doTest(printSuccess) |
| { |
| shouldBe(f0(1), "f0(1)", 1, printSuccess); |
| shouldBe(f1(2, 3), "f1(2, 3)", 3, printSuccess); |
| shouldBe(f2(4), "f2(4)", 4, printSuccess); |
| shouldBe(f3(5, 6), "f3(5, 6)", 6, printSuccess); |
| shouldBe(f4(7)[0], "f4(7)", 7, printSuccess); |
| shouldBe(f5(8, 9)[1], "f5(8, 9)", 9, printSuccess); |
| shouldBe(f6(10)[0], "f6(10)", 10, printSuccess); |
| shouldBe(f7(11, 12)[1], "f7(11, 12)", 12, printSuccess); |
| } |
| |
| if (self.testRunner) { |
| var functions = [f0, f1, f2, f3, f4, f5, f6, f7]; |
| for (var i = 0; i < functions.length; ++i) |
| testRunner.neverInlineFunction(functions[i]); |
| for (;;) { |
| var allCompiled = true; |
| for (var i = 0; i < functions.length; ++i) { |
| if (!testRunner.numberOfDFGCompiles(functions[i])) |
| allCompiled = false; |
| } |
| if (allCompiled) |
| break; |
| doTest(false); |
| } |
| } |
| |
| doTest(true); |
| </script> |