| <p></p> |
| |
| <pre id="console"></pre> |
| |
| <script> |
| function $(id) |
| { |
| return document.getElementById(id); |
| } |
| |
| function log(s) |
| { |
| $("console").appendChild(document.createTextNode(s + "\n")); |
| } |
| |
| function shouldBeNoEval(aDescription, a, b) |
| { |
| if (a === b) { |
| log("PASS: " + aDescription + " should be " + b + " and is."); |
| return; |
| } |
| |
| log("FAIL: " + aDescription + " should be " + b + " but instead is " + a + "."); |
| } |
| |
| if (window.testRunner) |
| testRunner.dumpAsText(); |
| |
| // eval should lazily create 'arguments'. |
| function f1() { |
| if (false) |
| return arguments; |
| return eval("arguments"); |
| } |
| shouldBeNoEval("f1(1)[0]", f1(1)[0], 1); |
| |
| // 'arguments' created by eval should be live. |
| function f2(x) { |
| var a = eval("arguments"); |
| x = 0; |
| return a; |
| } |
| shouldBeNoEval("f2(1)[0]", f2(1)[0], 0); |
| |
| // overwriting 'arguments' after lazily creating it should succeed. |
| function f3() { |
| var x = arguments; |
| var arguments = [0]; |
| return arguments; |
| } |
| shouldBeNoEval("f3(1)[0]", f3(1)[0], 0); |
| |
| // overwriting 'arguments' before lazily creating it should succeed. |
| function f4() { |
| var arguments = [0]; |
| var x = arguments; |
| return arguments; |
| } |
| shouldBeNoEval("f4(1)[0]", f4(1)[0], 0); |
| |
| // eval should access local, shared 'arguments'. |
| function f5() { |
| eval("arguments.x = 1"); |
| return eval("arguments"); |
| } |
| shouldBeNoEval("f5().x", f5().x, 1); |
| |
| // accessing another function's .arguments should not accidentally overwrite your own(!). |
| function f6() { |
| return g6(1); |
| } |
| function g6() { |
| f6.arguments; |
| return g6.arguments; |
| } |
| shouldBeNoEval("f6()[0]", f6()[0], 1); |
| |
| // access to another function's .arguments should not produce a shared object. |
| function f7() { |
| return g7(); |
| } |
| function g7() { |
| return f7.arguments === f7.arguments; |
| } |
| shouldBeNoEval("f7()", f7(), false); |
| |
| // ...unless the other function uses 'arguments'. |
| function f8() { |
| arguments; |
| return g8(); |
| } |
| function g8() { |
| return f7.arguments === f7.arguments; |
| } |
| shouldBeNoEval("f8()", f8(), true); |
| </script> |