summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/arguments/args-exists.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/arguments/args-exists.js')
-rw-r--r--js/src/jit-test/tests/arguments/args-exists.js109
1 files changed, 109 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/arguments/args-exists.js b/js/src/jit-test/tests/arguments/args-exists.js
new file mode 100644
index 0000000000..35ea8e20bb
--- /dev/null
+++ b/js/src/jit-test/tests/arguments/args-exists.js
@@ -0,0 +1,109 @@
+// Test |in| operator on arguments objects.
+
+function testBasic() {
+ function arg0() { return 0 in arguments; }
+ function arg1() { return 1 in arguments; }
+ function arg100() { return 100 in arguments; }
+ function argn1() { return -1 in arguments; }
+ function argv(i) { return i in arguments; }
+
+ for (let i = 0; i < 100; ++i) {
+ assertEq(arg0(), false);
+ assertEq(arg0(1), true);
+ assertEq(arg0(1, 2), true);
+ assertEq(arg0(1, 2, 3), true);
+ assertEq(arg0(1, 2, 3, 4), true);
+ assertEq(arg0(1, 2, 3, 4, 5), true);
+
+ assertEq(arg1(), false);
+ assertEq(arg1(1), false);
+ assertEq(arg1(1, 2), true);
+ assertEq(arg1(1, 2, 3), true);
+ assertEq(arg1(1, 2, 3, 4), true);
+ assertEq(arg1(1, 2, 3, 4, 5), true);
+
+ assertEq(arg100(), false);
+ assertEq(arg100(1), false);
+ assertEq(arg100(1, 2), false);
+ assertEq(arg100(1, 2, 3), false);
+ assertEq(arg100(1, 2, 3, 4), false);
+ assertEq(arg100(1, 2, 3, 4, 5), false);
+
+ assertEq(argn1(), false);
+ assertEq(argn1(1), false);
+ assertEq(argn1(1, 2), false);
+ assertEq(argn1(1, 2, 3), false);
+ assertEq(argn1(1, 2, 3, 4), false);
+ assertEq(argn1(1, 2, 3, 4, 5), false);
+
+ assertEq(argv(i & 3), (i&3) <= 0);
+ assertEq(argv(i & 3, 1), (i&3) <= 1);
+ assertEq(argv(i & 3, 1, 2), (i&3) <= 2);
+ assertEq(argv(i & 3, 1, 2, 3), true);
+ assertEq(argv(i & 3, 1, 2, 3, 4), true);
+ assertEq(argv(i & 3, 1, 2, 3, 4, 5), true);
+ }
+}
+testBasic();
+
+// Modifying |arguments.length| doesn't change the result.
+function testOverriddenLength() {
+ function f(i) {
+ if (i === 100) {
+ arguments.length = 100;
+ }
+ return 1 in arguments;
+ }
+
+ for (let i = 0; i <= 150; ++i) {
+ assertEq(f(i), false);
+ }
+}
+testOverriddenLength();
+
+// Overridden elements are correctly detected.
+function testOverriddenElement() {
+ function f(i) {
+ if (i === 100) {
+ arguments[1] = 0;
+ }
+ return 1 in arguments;
+ }
+
+ for (let i = 0; i <= 150; ++i) {
+ assertEq(f(i), i === 100);
+ }
+}
+testOverriddenElement();
+
+// Deleted elements are correctly detected.
+function testDeletedElement() {
+ function f(i) {
+ if (i === 100) {
+ delete arguments[0];
+ }
+ return 0 in arguments;
+ }
+
+ for (let i = 0; i <= 150; ++i) {
+ assertEq(f(i), i !== 100);
+ }
+}
+testDeletedElement();
+
+// Contrary to most other arguments object optimisations, forwarded arguments
+// don't inhibit optimising the |in| operator.
+function testForwardedArg() {
+ function f(i) {
+ function closedOver() {
+ if (i === 100) i = 0;
+ }
+ closedOver();
+ return 0 in arguments;
+ }
+
+ for (let i = 0; i <= 150; ++i) {
+ assertEq(f(i), true);
+ }
+}
+testForwardedArg();