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/guard-has-getter-setter.js | |
parent | Initial commit. (diff) | |
download | firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.tar.xz firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.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/guard-has-getter-setter.js')
-rw-r--r-- | js/src/jit-test/tests/warp/guard-has-getter-setter.js | 263 |
1 files changed, 263 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/warp/guard-has-getter-setter.js b/js/src/jit-test/tests/warp/guard-has-getter-setter.js new file mode 100644 index 0000000000..dc4b1d9ebd --- /dev/null +++ b/js/src/jit-test/tests/warp/guard-has-getter-setter.js @@ -0,0 +1,263 @@ +// Access property once. +function simple() { + var obj = { + get p() { + return 1; + } + }; + + // Use objects with different shapes to enter megamorphic state for + // the JSOp::GetProp opcode. + var array = [ + Object.create(obj, {a: {value: 1}}), + Object.create(obj, {b: {value: 2}}), + Object.create(obj, {c: {value: 3}}), + Object.create(obj, {d: {value: 4}}), + Object.create(obj, {e: {value: 5}}), + Object.create(obj, {f: {value: 6}}), + Object.create(obj, {g: {value: 7}}), + Object.create(obj, {h: {value: 8}}), + ]; + + var r = 0; + for (var i = 0; i < 200; ++i) { + var o = array[i & 7]; + r += o.p; + } + assertEq(r, 200); +} +simple(); + +// Access property multiple times (consecutive) to test that MGuardHasGetterSetter +// ops can be merged. +function consecutive() { + var obj = { + get p() { + return 1; + } + }; + + // Use objects with different shapes to enter megamorphic state for + // the JSOp::GetProp opcode. + var array = [ + Object.create(obj, {a: {value: 1}}), + Object.create(obj, {b: {value: 2}}), + Object.create(obj, {c: {value: 3}}), + Object.create(obj, {d: {value: 4}}), + Object.create(obj, {e: {value: 5}}), + Object.create(obj, {f: {value: 6}}), + Object.create(obj, {g: {value: 7}}), + Object.create(obj, {h: {value: 8}}), + ]; + + var r = 0; + for (var i = 0; i < 200; ++i) { + var o = array[i & 7]; + + r += o.p; + r += o.p; + r += o.p; + r += o.p; + } + assertEq(r, 4 * 200); +} +consecutive(); + +// Access property multiple times (loop) to test LICM. +function loop() { + var obj = { + get p() { + return 1; + } + }; + + // Use objects with different shapes to enter megamorphic state for + // the JSOp::GetProp opcode. + var array = [ + Object.create(obj, {a: {value: 1}}), + Object.create(obj, {b: {value: 2}}), + Object.create(obj, {c: {value: 3}}), + Object.create(obj, {d: {value: 4}}), + Object.create(obj, {e: {value: 5}}), + Object.create(obj, {f: {value: 6}}), + Object.create(obj, {g: {value: 7}}), + Object.create(obj, {h: {value: 8}}), + ]; + + var r = 0; + for (var i = 0; i < 200; ++i) { + var o = array[i & 7]; + + for (var j = 0; j < 5; ++j) { + r += o.p; + } + } + assertEq(r, 5 * 200); +} +loop(); + +// Bailout when prototype changes. +function modifyProto() { + var obj = { + get p() { + return 1; + } + }; + + var obj2 = { + get p() { + return 2; + } + }; + + // Use objects with different shapes to enter megamorphic state for + // the JSOp::GetProp opcode. + var array = [ + Object.create(obj, {a: {value: 1}}), + Object.create(obj, {b: {value: 2}}), + Object.create(obj, {c: {value: 3}}), + Object.create(obj, {d: {value: 4}}), + Object.create(obj, {e: {value: 5}}), + Object.create(obj, {f: {value: 6}}), + Object.create(obj, {g: {value: 7}}), + Object.create(obj, {h: {value: 8}}), + ]; + + var r = 0; + for (var i = 0; i < 200; ++i) { + var o = array[i & 7]; + + r += o.p; + + // Always execute Object.setPrototypeOf() to avoid cold code bailouts, + // which would happen for conditional code like if-statements. But only + // actually change |o|'s prototype once. + var j = (i === 100) | 0; + var q = [{}, o][j]; + Object.setPrototypeOf(q, obj2); + + r += o.p; + } + assertEq(r, 2 * 200 + Math.floor(100 / 8) * 2 + 1); +} +modifyProto(); + +// Bailout when property is changed to own data property. +function modifyToOwnValue() { + var obj = { + get p() { + return 1; + } + }; + + // Use objects with different shapes to enter megamorphic state for + // the JSOp::GetProp opcode. + var array = [ + Object.create(obj, {a: {value: 1}}), + Object.create(obj, {b: {value: 2}}), + Object.create(obj, {c: {value: 3}}), + Object.create(obj, {d: {value: 4}}), + Object.create(obj, {e: {value: 5}}), + Object.create(obj, {f: {value: 6}}), + Object.create(obj, {g: {value: 7}}), + Object.create(obj, {h: {value: 8}}), + ]; + + var r = 0; + for (var i = 0; i < 200; ++i) { + var o = array[i & 7]; + + r += o.p; + + // Always execute Object.setPrototypeOf() to avoid cold code bailouts, + // which would happen for conditional code like if-statements. But only + // actually change |o|'s prototype once. + var j = (i === 100) | 0; + var q = [{}, o][j]; + Object.defineProperty(q, "p", {value: 2}); + + r += o.p; + } + assertEq(r, 2 * 200 + Math.floor(100 / 8) * 2 + 1); +} +modifyToOwnValue(); + +// Bailout when property is changed to own accessor property. +function modifyToOwnAccessor() { + var obj = { + get p() { + return 1; + } + }; + + // Use objects with different shapes to enter megamorphic state for + // the JSOp::GetProp opcode. + var array = [ + Object.create(obj, {a: {value: 1}}), + Object.create(obj, {b: {value: 2}}), + Object.create(obj, {c: {value: 3}}), + Object.create(obj, {d: {value: 4}}), + Object.create(obj, {e: {value: 5}}), + Object.create(obj, {f: {value: 6}}), + Object.create(obj, {g: {value: 7}}), + Object.create(obj, {h: {value: 8}}), + ]; + + var r = 0; + for (var i = 0; i < 200; ++i) { + var o = array[i & 7]; + + r += o.p; + + // Always execute Object.setPrototypeOf() to avoid cold code bailouts, + // which would happen for conditional code like if-statements. But only + // actually change |o|'s prototype once. + var j = (i === 100) | 0; + var q = [{}, o][j]; + Object.defineProperty(q, "p", {get() { return 2; }}); + + r += o.p; + } + assertEq(r, 2 * 200 + Math.floor(100 / 8) * 2 + 1); +} +modifyToOwnAccessor(); + +// Bailout when changing accessor. +function modifyProtoAccessor() { + var obj = { + get p() { + return 1; + } + }; + + // Use objects with different shapes to enter megamorphic state for + // the JSOp::GetProp opcode. + var array = [ + Object.create(obj, {a: {value: 1}}), + Object.create(obj, {b: {value: 2}}), + Object.create(obj, {c: {value: 3}}), + Object.create(obj, {d: {value: 4}}), + Object.create(obj, {e: {value: 5}}), + Object.create(obj, {f: {value: 6}}), + Object.create(obj, {g: {value: 7}}), + Object.create(obj, {h: {value: 8}}), + ]; + + var r = 0; + for (var i = 0; i < 200; ++i) { + var o = array[i & 7]; + + r += o.p; + + // Always execute Object.setPrototypeOf() to avoid cold code bailouts, + // which would happen for conditional code like if-statements. But only + // actually change |o|'s prototype once. + var j = (i === 100) | 0; + var q = [{}, obj][j]; + Object.defineProperty(q, "p", {get() { return 2; }}); + + r += o.p; + } + assertEq(r, 2 * 200 + 100 * 2 - 1); +} +modifyProtoAccessor(); |