| // Test that invoking the interrupt callback counts as a step. |
| |
| function testResumptionVal(resumptionVal, turnOffDebugMode) { |
| var g = newGlobal(); |
| var dbg = new Debugger; |
| g.log = ""; |
| g.resumptionVal = resumptionVal; |
| |
| setInterruptCallback(function () { |
| g.log += "i"; |
| dbg.addDebuggee(g); |
| var frame = dbg.getNewestFrame(); |
| frame.onStep = function () { |
| g.log += "s"; |
| frame.onStep = undefined; |
| |
| if (turnOffDebugMode) |
| dbg.removeDebuggee(g); |
| |
| return resumptionVal; |
| }; |
| return true; |
| }); |
| |
| try { |
| return g.eval("(" + function f() { |
| log += "f"; |
| invokeInterruptCallback(function (interruptRv) { |
| log += "r"; |
| assertEq(interruptRv, resumptionVal == undefined); |
| }); |
| log += "a"; |
| return 42; |
| } + ")();"); |
| } finally { |
| assertEq(g.log, resumptionVal == undefined ? "fisra" : "fisr"); |
| } |
| } |
| |
| assertEq(testResumptionVal(undefined), 42); |
| assertEq(testResumptionVal({ return: "not 42" }), "not 42"); |
| try { |
| testResumptionVal({ throw: "thrown 42" }); |
| } catch (e) { |
| assertEq(e, "thrown 42"); |
| } |
| |
| assertEq(testResumptionVal(undefined, true), 42); |
| assertEq(testResumptionVal({ return: "not 42" }, true), "not 42"); |
| |
| try { |
| testResumptionVal({ throw: "thrown 42" }, true); |
| } catch (e) { |
| assertEq(e, "thrown 42"); |
| } |