// Check whether we respect resumption values when toggling debug mode on->off // from various points with live scripts on the stack. var g = newGlobal(); var dbg = new Debugger; function reset() { dbg.onEnterFrame = undefined; dbg.onDebuggerStatement = undefined; dbg.addDebuggee(g); g.eval("(" + function test() { for (i = 0; i < 5; i++) f(42); } + ")();"); } g.eval("" + function f(d) { return g(d); }); g.eval("" + function g(d) { debugger; return d; }); function testResumptionValues(handlerSetter) { // Test normal return. reset(); handlerSetter(undefined); assertEq(g.eval("(" + function test() { return f(42); } + ")();"), 42); // Test forced return. reset(); handlerSetter({ return: "not 42" }); assertEq(g.eval("(" + function test() { return f(42); } + ")();"), "not 42"); // Test throw. reset(); handlerSetter({ throw: "thrown 42" }); try { g.eval("(" + function test() { return f(42); } + ")();");; } catch (e) { assertEq(e, "thrown 42"); } } // Turn off from within the prologue. testResumptionValues(function (resumptionVal) { dbg.onEnterFrame = function (frame) { if (frame.older) { if (frame.older.older) { dbg.removeDebuggee(g); return resumptionVal; } } }; }); // Turn off from within the epilogue. testResumptionValues(function (resumptionVal) { dbg.onEnterFrame = function (frame) { if (frame.older) { if (frame.older.older) { frame.onPop = function () { dbg.removeDebuggee(g); return resumptionVal; }; } } }; }); // Turn off from within debugger statement handler. testResumptionValues(function (resumptionVal) { dbg.onDebuggerStatement = function (frame) { dbg.removeDebuggee(g); return resumptionVal; }; }); // Turn off from within debug trap handler. testResumptionValues(function (resumptionVal) { dbg.onEnterFrame = function (frame) { if (frame.older) { if (frame.older.older) { frame.onStep = function () { dbg.removeDebuggee(g); return resumptionVal; } } } }; });