summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/realms/switch-realms-scripted.js
diff options
context:
space:
mode:
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.js113
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);