| // An unmapped arguments object is created for strict functions or functions |
| // with default/rest/destructuring args. |
| |
| load(libdir + "asserts.js"); |
| |
| function testDefaults(a, b=3) { |
| a = 3; |
| b = 4; |
| assertEq(arguments.length, 1); |
| assertEq(arguments[0], 1); |
| assertEq(arguments[1], undefined); |
| arguments[0] = 5; |
| assertEq(a, 3); |
| assertThrowsInstanceOf(() => arguments.callee, TypeError); |
| } |
| testDefaults(1); |
| |
| function testRest(a, ...rest) { |
| a = 3; |
| assertEq(arguments.length, 3); |
| assertEq(arguments[0], 1); |
| assertEq(arguments[1], 2); |
| arguments[0] = 5; |
| assertEq(a, 3); |
| arguments[1] = 6; |
| assertEq(arguments[1], 6); |
| assertEq(rest.toString(), "2,3"); |
| assertThrowsInstanceOf(() => arguments.callee, TypeError); |
| } |
| testRest(1, 2, 3); |
| |
| function testDestructuring(a, {foo, bar}, b) { |
| a = 3; |
| bar = 4; |
| b = 1; |
| assertEq(arguments.length, 3); |
| assertEq(arguments[0], 1); |
| assertEq(arguments[1].bar, 2); |
| assertEq(arguments[2], 9); |
| assertThrowsInstanceOf(() => arguments.callee, TypeError); |
| } |
| testDestructuring(1, {foo: 1, bar: 2}, 9); |
| |
| function testStrict(a) { |
| "use strict"; |
| a = 3; |
| assertEq(arguments[0], 1); |
| arguments[0] = 8; |
| assertEq(a, 3); |
| assertThrowsInstanceOf(() => arguments.callee, TypeError); |
| } |
| testStrict(1, 2); |
| |
| function testMapped(a) { |
| a = 3; |
| assertEq(arguments[0], 3); |
| arguments[0] = 5; |
| assertEq(a, 5); |
| assertEq(arguments.callee, testMapped); |
| } |
| testMapped(1); |