michael@0: // The debugger can eval in any frame in the stack even if every frame was michael@0: // pushed in a different context. michael@0: michael@0: var g = newGlobal(); michael@0: g.eval('function f(a) {\n' + michael@0: ' if (a == 1)\n' + michael@0: ' debugger;\n' + michael@0: ' else\n' + michael@0: ' evaluate("f(" + a + " - 1);", {newContext: true});\n' + michael@0: '}\n'); michael@0: var N = 9; michael@0: michael@0: var dbg = new Debugger(g); michael@0: var frames = []; michael@0: var hits = 0; michael@0: dbg.onEnterFrame = function (frame) { michael@0: if (frame.type == "call" && frame.callee.name == "f") { michael@0: frames.push(frame); michael@0: frame.onPop = function () { assertEq(frames.pop(), frame); }; michael@0: } michael@0: }; michael@0: dbg.onDebuggerStatement = function (frame) { michael@0: assertEq(frames.length, N); michael@0: var i = N; michael@0: for (var f of frames) michael@0: assertEq(f.eval('a').return, i--); michael@0: hits++; michael@0: }; michael@0: michael@0: g.f(N); michael@0: assertEq(hits, 1); michael@0: assertEq(frames.length, 0);