michael@0: var g = newGlobal(); michael@0: var dbg = new Debugger; michael@0: var gw = dbg.addDebuggee(g); michael@0: michael@0: var hits = 0; michael@0: dbg.onDebuggerStatement = function (frame) { michael@0: hits++; michael@0: assertEq(frame.environment.parent.getVariable('y'), true); michael@0: }; michael@0: michael@0: g.eval("var g;" + michael@0: "function f(x) {" + michael@0: " let (y = x) {" + michael@0: " if (x)" + michael@0: " g = function() { eval('debugger') };" + michael@0: " else" + michael@0: " g();" + michael@0: " }" + michael@0: "}" + michael@0: "f(true);" + michael@0: "f(false);"); michael@0: assertEq(hits, 1); michael@0: michael@0: var hits = 0; michael@0: dbg.onDebuggerStatement = function (frame) { michael@0: hits++; michael@0: assertEq(frame.environment.parent.getVariable('y'), 1); michael@0: assertEq(frame.environment.parent.names().indexOf('z'), -1); michael@0: }; michael@0: michael@0: g.eval("var g;" + michael@0: "let (y = 1) {" + michael@0: " g = function () { debugger; };" + michael@0: " let (z = 2) {" + michael@0: " g();" + michael@0: " }"+ michael@0: "}"); michael@0: assertEq(hits, 1); michael@0: michael@0: var hits = 0; michael@0: dbg.onDebuggerStatement = function (frame) { michael@0: hits++; michael@0: var e = frame.older.environment.parent; michael@0: assertEq(e.getVariable('z'), true); michael@0: e = e.parent; michael@0: assertEq(e.getVariable('y'), true); michael@0: }; michael@0: michael@0: g.eval("var g;" + michael@0: "function h() { debugger };" + michael@0: "for (var x of [true, false]) {" + michael@0: " let (y = x) {" + michael@0: " let (z = x) {" + michael@0: " if (x)" + michael@0: " g = function () { print(z); h() };" + michael@0: " else" + michael@0: " g();" + michael@0: " }" + michael@0: " }" + michael@0: "}"); michael@0: assertEq(hits, 1);