diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /js/src/jit-test/tests/fuses/cross-realm.js | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'js/src/jit-test/tests/fuses/cross-realm.js')
-rw-r--r-- | js/src/jit-test/tests/fuses/cross-realm.js | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/fuses/cross-realm.js b/js/src/jit-test/tests/fuses/cross-realm.js new file mode 100644 index 0000000000..0b9c6541b9 --- /dev/null +++ b/js/src/jit-test/tests/fuses/cross-realm.js @@ -0,0 +1,57 @@ +// |jit-test| + +function f(x) { + let [a, b, c] = x; + return a + b + c; +} + +function intact(name) { + let state = getFuseState(); + if (!(name in state)) { + throw "No such fuse " + name; + } + return state[name].intact +} + +let didIt = false; +([])[Symbol.iterator]().__proto__['return'] = () => { didIt = true; return { done: true, value: undefined } }; +assertEq(intact("ArrayIteratorPrototypeHasNoReturnProperty"), false); + +assertEq(f([1, 2, 3, 0]), 6); +assertEq(didIt, true); + +didIt = false; +g = newGlobal(); +g.evaluate(f.toString()); +// Passing in an array from this realm should mean that the return is triggered. +g.long = [1, 2, 3, 0]; +g.evaluate("assertEq(f(long),6)") +g.evaluate(intact.toString()); +// ensure fuse isn't popped inside g. +g.evaluate(`assertEq(intact("ArrayIteratorPrototypeHasNoReturnProperty"), true)`) +assertEq(didIt, true); + +didIt = false; +g = newGlobal(); +g.evaluate(f.toString()); +// Passing in an array from this realm should mean that the return is triggered. +g.long = [1, 2, 3, 0]; + +// Warm up this global's f. +g.evaluate(` +for (let i = 0; i < 100; i++) { + assertEq(f([1, 2, 3, 0]), 6); +} +`); + +assertEq(didIt, false); +g.evaluate("assertEq(f(long), 6)"); +assertEq(didIt, true); + +delete Array.prototype[Symbol.iterator] +let success = false; +try { f([1, 2, 3, 4]); success = true } catch (e) { } +assertEq(success, false); + +try { g.evaluate("assertEq(f(long), 6)"); success = true } catch (e) { } +assertEq(success, false); |