diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
commit | 36d22d82aa202bb199967e9512281e9a53db42c9 (patch) | |
tree | 105e8c98ddea1c1e4784a60a5a6410fa416be2de /js/src/jit-test/tests/ion/inlining/getelem-getter-megamorphic.js | |
parent | Initial commit. (diff) | |
download | firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip |
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'js/src/jit-test/tests/ion/inlining/getelem-getter-megamorphic.js')
-rw-r--r-- | js/src/jit-test/tests/ion/inlining/getelem-getter-megamorphic.js | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/ion/inlining/getelem-getter-megamorphic.js b/js/src/jit-test/tests/ion/inlining/getelem-getter-megamorphic.js new file mode 100644 index 0000000000..2b8fdddcd0 --- /dev/null +++ b/js/src/jit-test/tests/ion/inlining/getelem-getter-megamorphic.js @@ -0,0 +1,79 @@ +// Test for inlined getters for jsop_getelem accesses, where the getter is a +// property on the prototype and a megamorphic IC is attached. + +function makeObjects(name) { + class Base { + constructor(v) { + this._prop = v; + } + get [name]() { + return this._prop; + } + } + + // When we hit |TYPE_FLAG_OBJECT_COUNT_LIMIT|, the objects are marked as + // |TYPE_FLAG_ANYOBJECT|. That means less than |TYPE_FLAG_OBJECT_COUNT_LIMIT| + // objects need to be created to have no unknown objects in the type set. + const TYPE_FLAG_OBJECT_COUNT_LIMIT = 7; + + // |ICState::ICState::MaxOptimizedStubs| defines the maximum number of + // optimized stubs, so as soon as we hit the maximum number, the megamorphic + // state is entered. + const ICState_MaxOptimizedStubs = 6; + + // Create enough classes to enter megamorphic state, but not too much to + // have |TYPE_FLAG_ANYOBJECT| in the TypeSet. + const OBJECT_COUNT = Math.min(ICState_MaxOptimizedStubs, TYPE_FLAG_OBJECT_COUNT_LIMIT); + + var objects = []; + for (var i = 0; i < OBJECT_COUNT; ++i) { + objects.push(new class extends Base {}(1)); + } + + return objects; +} + +// Defined outside of the test functions to ensure they're recognised as +// constants in Ion. +var atom = "prop"; +var symbol = Symbol(); + +function testAtom() { + var objects = makeObjects(atom); + + function f() { + var actual = 0; + var expected = 0; + for (var i = 0; i < 1000; i++) { + var obj = objects[i % objects.length]; + actual += obj[atom]; + expected += obj._prop; + } + assertEq(actual, expected); + } + + for (var i = 0; i < 2; ++i) { + f(); + } +} +testAtom(); + +function testSymbol() { + var objects = makeObjects(symbol); + + function f() { + var actual = 0; + var expected = 0; + for (var i = 0; i < 1000; i++) { + var obj = objects[i % objects.length]; + actual += obj[symbol]; + expected += obj._prop; + } + assertEq(actual, expected); + } + + for (var i = 0; i < 2; ++i) { + f(); + } +} +testSymbol(); |