diff options
Diffstat (limited to 'js/src/jit-test/tests/realms/switch-realms-scripted.js')
-rw-r--r-- | js/src/jit-test/tests/realms/switch-realms-scripted.js | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/realms/switch-realms-scripted.js b/js/src/jit-test/tests/realms/switch-realms-scripted.js new file mode 100644 index 0000000000..24746fd4d1 --- /dev/null +++ b/js/src/jit-test/tests/realms/switch-realms-scripted.js @@ -0,0 +1,113 @@ +function testBasic() { + var g = newGlobal({sameCompartmentAs: this}); + g.evaluate("function foo() { return scriptedCallerGlobal(); }"); + for (var i = 0; i < 20; i++) + assertEq(g.foo(), g); + + g.evaluate("function Obj() {}"); + for (var i = 0; i < 30; i++) + assertEq(objectGlobal(new g.Obj()), g); +} +testBasic(); + +function testFunCall() { + var g = newGlobal({sameCompartmentAs: this}); + g.evaluate("function foo() { return scriptedCallerGlobal(); }"); + for (var i = 0; i < 20; i++) + assertEq(g.foo.call(1, 2), g); +} +testFunCall(); + +function testFunApplyArgs() { + var g = newGlobal({sameCompartmentAs: this}); + g.evaluate("function foo() { return scriptedCallerGlobal(); }"); + for (var i = 0; i < 2000; i++) + assertEq(g.foo.apply(null, arguments), g); +} +testFunApplyArgs(1, 2); + +function testFunApplyArray() { + var g = newGlobal({sameCompartmentAs: this}); + g.evaluate("function foo() { return scriptedCallerGlobal(); }"); + var arr = [1, 2]; + for (var i = 0; i < 2000; i++) + assertEq(g.foo.apply(null, arr), g); +} +testFunApplyArray(); + +function testAccessor() { + var g = newGlobal({sameCompartmentAs: this}); + g.evaluate("function foo() { return scriptedCallerGlobal(); }"); + var o = {}; + Object.defineProperty(o, "foo", {get: g.foo, set: g.foo}); + for (var i = 0; i < 20; i++) { + assertEq(o.foo, g); + o.foo = 1; + } +} +testAccessor(); + +function testGenerator() { + var thisGlobalGen = function*() {}; + var thisGlobalGenObj = thisGlobalGen(); + + var g = newGlobal({sameCompartmentAs: this}); + g.evaluate("function* gen() { for (var i = 0; i < 2; i++) yield new Array(1, 2); }"); + for (var i = 0; i < 20; i++) { + var o = g.gen(); + for (var j = 0; j < 2; j++) { + var res = thisGlobalGenObj.next.call(o); + assertEq(objectGlobal(res), g); + assertEq(Array.isArray(res.value), true); + assertEq(objectGlobal(res.value), g); + } + } +} +testGenerator(); + +function testException1() { + var g = newGlobal({sameCompartmentAs: this}); + g.evaluate("function throwEx() { throw this; }"); + for (var i = 0; i < 20; i++) { + var ex; + try { + g.throwEx(); + } catch(e) { + ex = e; + } + assertCorrectRealm(); + assertEq(ex, g); + } +} +testException1(); + +function testException2() { + var g = newGlobal({sameCompartmentAs: this}); + g.evaluate("function f1(x) { if (x > 100) throw x; }"); + g.f2 = function(x) { return g.f1(x); } + g.f3 = function(x) { return g.f2(x); } + g.evaluate("function f4(x) { try { return f3(x); } finally { assertCorrectRealm(); } }"); + var ex; + try { + for (var i = 0; i < 110; i++) { + g.f4(i); + } + } catch (e) { + ex = e; + } + assertCorrectRealm(); + assertEq(ex, 101); +} +testException2(); +testException2(); + +function testException3(x) { + var g = newGlobal({sameCompartmentAs: this}); + g.f1 = function(x) { if (x === max + 2) throw 1; } + g.evaluate("function f2(x) { try { return f1(x); } catch(e) {} }"); + var max = 15; + for (var i = 0; i < max; i++) + g.f2(x * max + i); +} +testException3(0); +testException3(1); |