| function assert(b) { |
| if (!b) |
| throw new Error("Bad") |
| } |
| |
| function makeTest(shouldCaptureArgument, deleteTwice, zeroAsString) { |
| return eval(` |
| function foo(x) { |
| ${shouldCaptureArgument ? `function bar() { return x; }` : ""} |
| |
| assert(x === null); |
| |
| let prop = ${zeroAsString ? "'0'" : "0"}; |
| Object.defineProperty(arguments, "0", {enumerable: false, value:45}); |
| assert(arguments[prop] === 45); |
| assert(x === 45); |
| |
| let result = delete arguments[prop]; |
| assert(result); |
| ${deleteTwice ? `assert(delete arguments[prop]);` : ""}; |
| |
| assert(arguments[prop] === undefined); // don't crash here. |
| assert(!(prop in arguments)); |
| |
| arguments[prop] = 50; |
| |
| assert(arguments[prop] === 50); |
| assert(x === 45); |
| }; foo; |
| `); |
| } |
| |
| let functions = []; |
| functions.push(makeTest(false, false, true)); |
| functions.push(makeTest(false, false, false)); |
| functions.push(makeTest(false, true, false)); |
| functions.push(makeTest(false, true, true)); |
| functions.push(makeTest(true, false, true)); |
| functions.push(makeTest(true, false, false)); |
| functions.push(makeTest(true, true, false)); |
| functions.push(makeTest(true, true, true)); |
| |
| for (let f of functions) { |
| noInline(f); |
| for (let i = 0; i < 1000; ++i) |
| f(null); |
| } |