summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/cacheir/megamorphic-get-has-dense.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/cacheir/megamorphic-get-has-dense.js')
-rw-r--r--js/src/jit-test/tests/cacheir/megamorphic-get-has-dense.js63
1 files changed, 63 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/cacheir/megamorphic-get-has-dense.js b/js/src/jit-test/tests/cacheir/megamorphic-get-has-dense.js
new file mode 100644
index 0000000000..b6098435a1
--- /dev/null
+++ b/js/src/jit-test/tests/cacheir/megamorphic-get-has-dense.js
@@ -0,0 +1,63 @@
+setJitCompilerOption("ic.force-megamorphic", 1);
+
+function testBasic() {
+ // Create various native objects with dense elements.
+ var objs = [[1, 2, 3], {0: 1, 1: 2, 2: 3}];
+ var fun = x => x;
+ fun[0] = 1;
+ fun[1] = 2;
+ fun[2] = 3;
+ objs.push(fun);
+ for (var i = 0; i < 20; i++) {
+ var o = {};
+ o["x" + i] = i;
+ o[0] = 1;
+ o[1] = 2;
+ if (i < 10) {
+ o[2] = 3;
+ } else {
+ // o[2] will be a hole.
+ o[3] = 4;
+ }
+ objs.push(o);
+ }
+
+ // Access their dense elements.
+ for (var i = 0; i < 10; i++) {
+ for (var j = 0; j < objs.length; j++) {
+ var obj = objs[j];
+ assertEq(obj[0], 1);
+ assertEq(obj[1], 2);
+ assertEq(obj[2], j < 13 ? 3 : undefined);
+ assertEq(obj[3], j >= 13 ? 4 : undefined);
+ assertEq(0 in obj, true);
+ assertEq(1 in obj, true);
+ assertEq(2 in obj, j < 13);
+ assertEq(3 in obj, j >= 13);
+ assertEq(Object.hasOwn(obj, 0), true);
+ assertEq(Object.hasOwn(obj, 1), true);
+ assertEq(Object.hasOwn(obj, 2), j < 13);
+ assertEq(Object.hasOwn(obj, 3), j >= 13);
+ }
+ }
+}
+testBasic();
+
+function testNonNative() {
+ var arr = [1, 2, 3];
+ var proxy = new Proxy({}, {
+ get(target, prop) { return 456; },
+ has(target, prop) { return prop === "0"; },
+ });
+ for (var i = 0; i < 100; i++) {
+ var obj = i < 95 ? arr : proxy;
+ assertEq(obj[0], i < 95 ? 1 : 456);
+ assertEq(0 in obj, true);
+ assertEq(1 in obj, i < 95);
+ assertEq(4 in obj, false);
+ assertEq(Object.hasOwn(obj, 0), i < 95);
+ assertEq(Object.hasOwn(obj, 1), i < 95);
+ assertEq(Object.hasOwn(obj, 4), false);
+ }
+}
+testNonNative();