michael@0: // |jit-test| debug michael@0: function f() { michael@0: let (x = 1) { michael@0: while (true) { michael@0: yield evalInFrame(0, "x"); michael@0: x++; michael@0: let (y = 1) { michael@0: yield evalInFrame(0, "++y"); michael@0: yield evalInFrame(0, "++y"); michael@0: } michael@0: } michael@0: } michael@0: } michael@0: michael@0: var gen = f(); michael@0: assertEq(gen.next(), 1); michael@0: assertEq(gen.next(), 2); michael@0: gc(); michael@0: assertEq(gen.next(), 3); michael@0: gc(); michael@0: assertEq(gen.next(), 2); michael@0: assertEq(gen.next(), 2); michael@0: gc(); michael@0: assertEq(gen.next(), 3); michael@0: gc(); michael@0: assertEq(gen.next(), 3); michael@0: assertEq(gen.next(), 2); michael@0: gc(); michael@0: assertEq(gen.next(), 3); michael@0: gen = null; michael@0: gc(); michael@0: michael@0: function g() { michael@0: let (x = 1) { michael@0: while (true) { michael@0: var inner = function (inc) { x += inc; return evalInFrame(0, "x") }; michael@0: assertEq(inner(0), x); michael@0: yield inner; michael@0: assertEq(inner(0), x); michael@0: } michael@0: } michael@0: } michael@0: michael@0: var gen = g(); michael@0: var g1 = gen.next(); michael@0: var g2 = gen.next(); michael@0: gc(); michael@0: assertEq(g1(1), 2); michael@0: assertEq(g2(1), 3); michael@0: gc(); michael@0: assertEq(g1(1), 4); michael@0: assertEq(g2(1), 5); michael@0: gen = g1 = g2 = null; michael@0: gc();