load(libdir + "evalInFrame.js"); function f() { { let x = 1; while (true) { yield evalInFrame(0, "x"); x++; { let y = 1; yield evalInFrame(0, "++y"); yield evalInFrame(0, "++y"); } } } } var gen = f(); assertEq(gen.next(), 1); assertEq(gen.next(), 2); gc(); assertEq(gen.next(), 3); gc(); assertEq(gen.next(), 2); assertEq(gen.next(), 2); gc(); assertEq(gen.next(), 3); gc(); assertEq(gen.next(), 3); assertEq(gen.next(), 2); gc(); assertEq(gen.next(), 3); gen = null; gc(); function g() { { let x = 1; while (true) { var inner = function (inc) { x += inc; return evalInFrame(0, "x") }; assertEq(inner(0), x); yield inner; assertEq(inner(0), x); } } } var gen = g(); var g1 = gen.next(); var g2 = gen.next(); gc(); assertEq(g1(1), 2); assertEq(g2(1), 3); gc(); assertEq(g1(1), 4); assertEq(g2(1), 5); gen = g1 = g2 = null; gc();