Bug 785689 - Debugger breaking when it shouldn't. r=msucan,vporof

This commit is contained in:
Panos Astithas 2012-09-12 14:10:05 +03:00
parent 2f88458c33
commit 3b9100236a
3 changed files with 112 additions and 17 deletions

View File

@ -261,26 +261,26 @@ ThreadActor.prototype = {
return undefined;
}
switch (aRequest.resumeLimit.type) {
case "step":
this.dbg.onEnterFrame = onEnterFrame;
// Fall through.
case "next":
let stepFrame = this._getNextStepFrame(startFrame);
if (stepFrame) {
let steppingType = aRequest.resumeLimit.type;
if (["step", "next", "finish"].indexOf(steppingType) == -1) {
return { error: "badParameterType",
message: "Unknown resumeLimit type" };
}
// Make sure there is still a frame on the stack if we are to continue
// stepping.
let stepFrame = this._getNextStepFrame(startFrame);
if (stepFrame) {
switch (steppingType) {
case "step":
this.dbg.onEnterFrame = onEnterFrame;
// Fall through.
case "next":
stepFrame.onStep = onStep;
stepFrame.onPop = onPop;
}
break;
case "finish":
stepFrame = this._getNextStepFrame(startFrame);
if (stepFrame) {
break;
case "finish":
stepFrame.onPop = onPop;
}
break;
default:
return { error: "badParameterType",
message: "Unknown resumeLimit type" };
}
}
}

View File

@ -0,0 +1,94 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/**
* Make sure that stepping in the last statement of the last frame doesn't
* cause an unexpected pause, when another JS frame is pushed on the stack
* (bug 785689).
*/
var gDebuggee;
var gClient;
var gThreadClient;
function run_test()
{
initTestDebuggerServer();
gDebuggee = addTestGlobal("test-stack");
gClient = new DebuggerClient(DebuggerServer.connectPipe());
gClient.connect(function () {
attachTestGlobalClientAndResume(gClient,
"test-stack",
function (aResponse, aThreadClient) {
gThreadClient = aThreadClient;
test_stepping_last();
});
});
do_test_pending();
}
function test_stepping_last()
{
gThreadClient.addOneTimeListener("paused", function (aEvent, aPacket) {
gThreadClient.addOneTimeListener("paused", function (aEvent, aPacket) {
// Check the return value.
do_check_eq(aPacket.type, "paused");
do_check_eq(aPacket.frame.where.line, gDebuggee.line0 + 2);
do_check_eq(aPacket.why.type, "resumeLimit");
// Check that stepping worked.
do_check_eq(gDebuggee.a, undefined);
do_check_eq(gDebuggee.b, undefined);
gThreadClient.addOneTimeListener("paused", function (aEvent, aPacket) {
// Check the return value.
do_check_eq(aPacket.type, "paused");
do_check_eq(aPacket.frame.where.line, gDebuggee.line0 + 3);
do_check_eq(aPacket.why.type, "resumeLimit");
// Check that stepping worked.
do_check_eq(gDebuggee.a, 1);
do_check_eq(gDebuggee.b, undefined);
gThreadClient.addOneTimeListener("paused", function (aEvent, aPacket) {
// Check the return value.
do_check_eq(aPacket.type, "paused");
// When leaving a stack frame the line number doesn't change.
do_check_eq(aPacket.frame.where.line, gDebuggee.line0 + 3);
do_check_eq(aPacket.why.type, "resumeLimit");
// Check that stepping worked.
do_check_eq(gDebuggee.a, 1);
do_check_eq(gDebuggee.b, 2);
gThreadClient.stepIn(function () {
test_next_pause();
});
});
gThreadClient.stepIn();
});
gThreadClient.stepIn();
});
gThreadClient.stepIn();
});
gDebuggee.eval("var line0 = Error().lineNumber;\n" +
"debugger;\n" + // line0 + 1
"var a = 1;\n" + // line0 + 2
"var b = 2;\n"); // line0 + 3
}
function test_next_pause()
{
gThreadClient.addOneTimeListener("paused", function (aEvent, aPacket) {
// Check the return value.
do_check_eq(aPacket.type, "paused");
// Before fixing bug 785689, the type was resumeLimit.
do_check_eq(aPacket.why.type, "debuggerStatement");
gThreadClient.resume(function () {
finishClient(gClient);
});
});
gDebuggee.eval("debugger;");
}

View File

@ -53,6 +53,7 @@ tail =
[test_stepping-02.js]
[test_stepping-03.js]
[test_stepping-04.js]
[test_stepping-05.js]
[test_framebindings-01.js]
[test_framebindings-02.js]
[test_framebindings-03.js]