diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 14:29:10 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 14:29:10 +0000 |
commit | 2aa4a82499d4becd2284cdb482213d541b8804dd (patch) | |
tree | b80bf8bf13c3766139fbacc530efd0dd9d54394c /js/src/jit-test/tests/warp/mega-morphic-load-and-has-prop.js | |
parent | Initial commit. (diff) | |
download | firefox-upstream.tar.xz firefox-upstream.zip |
Adding upstream version 86.0.1.upstream/86.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'js/src/jit-test/tests/warp/mega-morphic-load-and-has-prop.js')
-rw-r--r-- | js/src/jit-test/tests/warp/mega-morphic-load-and-has-prop.js | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/warp/mega-morphic-load-and-has-prop.js b/js/src/jit-test/tests/warp/mega-morphic-load-and-has-prop.js new file mode 100644 index 0000000000..0d77ceb316 --- /dev/null +++ b/js/src/jit-test/tests/warp/mega-morphic-load-and-has-prop.js @@ -0,0 +1,99 @@ +function testMegamorphicLoadSlot(i) { + var xs = [ + {p: 0}, + {a: 0, p: 1}, + {a: 0, b: 0, p: 2}, + {a: 0, b: 0, c: 0, p: 3}, + {a: 0, b: 0, c: 0, d: 0, p: 4}, + {a: 0, b: 0, c: 0, d: 0, e: 0, p: 5}, + {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, p: 6}, + {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, p: 7}, + {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, h: 0, p: 8}, + {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, h: 0, i: 0, p: 9}, + ]; + var called = 0; + var obj = { + get p() { + called++; + } + }; + + for (var j = 0; j <= 100; ++j) { + // Don't use if-statements to avoid cold code bailouts. + var x = xs[j % 10]; + var y = [x, obj][(i === 1 && j === 100)|0]; + + // Can't DCE this instruction. + y.p; + } + + assertEq(i === 0 || called === 1, true); +} +for (var i = 0; i < 2; ++i) testMegamorphicLoadSlot(i); + +function testMegamorphicLoadSlotByValue(i) { + var xs = [ + {p: 0}, + {a: 0, p: 1}, + {a: 0, b: 0, p: 2}, + {a: 0, b: 0, c: 0, p: 3}, + {a: 0, b: 0, c: 0, d: 0, p: 4}, + {a: 0, b: 0, c: 0, d: 0, e: 0, p: 5}, + {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, p: 6}, + {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, p: 7}, + {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, h: 0, p: 8}, + {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, h: 0, i: 0, p: 9}, + ]; + var called = 0; + var obj = { + get p() { + called++; + } + }; + + var p = "p"; + for (var j = 0; j <= 100; ++j) { + // Don't use if-statements to avoid cold code bailouts. + var x = xs[j % 10]; + var y = [x, obj][(i === 1 && j === 100)|0]; + + // Can't DCE this instruction. + y[p]; + } + + assertEq(i === 0 || called === 1, true); +} +for (var i = 0; i < 2; ++i) testMegamorphicLoadSlotByValue(i); + +function testMegamorphicHasProp(i) { + var xs = [ + {p: 0}, + {a: 0, p: 1}, + {a: 0, b: 0, p: 2}, + {a: 0, b: 0, c: 0, p: 3}, + {a: 0, b: 0, c: 0, d: 0, p: 4}, + {a: 0, b: 0, c: 0, d: 0, e: 0, p: 5}, + {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, p: 6}, + {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, p: 7}, + {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, h: 0, p: 8}, + {a: 0, b: 0, c: 0, d: 0, e: 0, f: 0, g: 0, h: 0, i: 0, p: 9}, + ]; + var called = 0; + var obj = new Proxy({}, { + has() { + called++; + } + }); + + for (var j = 0; j <= 100; ++j) { + // Don't use if-statements to avoid cold code bailouts. + var x = xs[j % 10]; + var y = [x, obj][(i === 1 && j === 100)|0]; + + // Can't DCE this instruction. + "p" in y; + } + + assertEq(i === 0 || called === 1, true); +} +for (var i = 0; i < 2; ++i) testMegamorphicHasProp(i); |