args-exists.js (2686B)
1 // Test |in| operator on arguments objects. 2 3 function testBasic() { 4 function arg0() { return 0 in arguments; } 5 function arg1() { return 1 in arguments; } 6 function arg100() { return 100 in arguments; } 7 function argn1() { return -1 in arguments; } 8 function argv(i) { return i in arguments; } 9 10 for (let i = 0; i < 100; ++i) { 11 assertEq(arg0(), false); 12 assertEq(arg0(1), true); 13 assertEq(arg0(1, 2), true); 14 assertEq(arg0(1, 2, 3), true); 15 assertEq(arg0(1, 2, 3, 4), true); 16 assertEq(arg0(1, 2, 3, 4, 5), true); 17 18 assertEq(arg1(), false); 19 assertEq(arg1(1), false); 20 assertEq(arg1(1, 2), true); 21 assertEq(arg1(1, 2, 3), true); 22 assertEq(arg1(1, 2, 3, 4), true); 23 assertEq(arg1(1, 2, 3, 4, 5), true); 24 25 assertEq(arg100(), false); 26 assertEq(arg100(1), false); 27 assertEq(arg100(1, 2), false); 28 assertEq(arg100(1, 2, 3), false); 29 assertEq(arg100(1, 2, 3, 4), false); 30 assertEq(arg100(1, 2, 3, 4, 5), false); 31 32 assertEq(argn1(), false); 33 assertEq(argn1(1), false); 34 assertEq(argn1(1, 2), false); 35 assertEq(argn1(1, 2, 3), false); 36 assertEq(argn1(1, 2, 3, 4), false); 37 assertEq(argn1(1, 2, 3, 4, 5), false); 38 39 assertEq(argv(i & 3), (i&3) <= 0); 40 assertEq(argv(i & 3, 1), (i&3) <= 1); 41 assertEq(argv(i & 3, 1, 2), (i&3) <= 2); 42 assertEq(argv(i & 3, 1, 2, 3), true); 43 assertEq(argv(i & 3, 1, 2, 3, 4), true); 44 assertEq(argv(i & 3, 1, 2, 3, 4, 5), true); 45 } 46 } 47 testBasic(); 48 49 // Modifying |arguments.length| doesn't change the result. 50 function testOverriddenLength() { 51 function f(i) { 52 if (i === 100) { 53 arguments.length = 100; 54 } 55 return 1 in arguments; 56 } 57 58 for (let i = 0; i <= 150; ++i) { 59 assertEq(f(i), false); 60 } 61 } 62 testOverriddenLength(); 63 64 // Overridden elements are correctly detected. 65 function testOverriddenElement() { 66 function f(i) { 67 if (i === 100) { 68 arguments[1] = 0; 69 } 70 return 1 in arguments; 71 } 72 73 for (let i = 0; i <= 150; ++i) { 74 assertEq(f(i), i === 100); 75 } 76 } 77 testOverriddenElement(); 78 79 // Deleted elements are correctly detected. 80 function testDeletedElement() { 81 function f(i) { 82 if (i === 100) { 83 delete arguments[0]; 84 } 85 return 0 in arguments; 86 } 87 88 for (let i = 0; i <= 150; ++i) { 89 assertEq(f(i), i !== 100); 90 } 91 } 92 testDeletedElement(); 93 94 // Contrary to most other arguments object optimisations, forwarded arguments 95 // don't inhibit optimising the |in| operator. 96 function testForwardedArg() { 97 function f(i) { 98 function closedOver() { 99 if (i === 100) i = 0; 100 } 101 closedOver(); 102 return 0 in arguments; 103 } 104 105 for (let i = 0; i <= 150; ++i) { 106 assertEq(f(i), true); 107 } 108 } 109 testForwardedArg();