// Generator methods work transparently on CrossCompartmentWrappers. load(libdir + "asserts.js"); load(libdir + "iteration.js"); function gen() { yield 1; yield 2; } var it = gen(); var g = newGlobal(); g.eval("function gen2() { yield 3; yield 4; }; var it2 = gen2();"); // LegacyGenerator.next assertEq(it.next.call(g.it2), 3); // LegacyGenerator.throw assertThrowsValue(() => it.throw.call(g.it2, 7), 7); function *gen3() { yield 1; yield 2; } it = gen3(); g.eval("function *gen4() { yield 5; yield 6; }; var it4 = gen4();"); // StarGenerator.next assertIteratorResult(it.next.call(g.it4), 5, false) // StarGenerator.throw assertThrowsValue(() => it.throw.call(g.it4, 8), 8); // StarGenerator.return assertIteratorResult(it.return.call(g.it4, 8), 8, true); // Other objects should throw. try { it.next.call([]); assertEq(0, 1); } catch (e) { assertEq(e.toString().includes("called on incompatible Array"), true); }