Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
deps: cherry-pick de5aaad from V8's upstream
Original commit message:

    [Debugger] Fix StepNext over function with caught exception

    Without CL debugger on StepNext adds breakpoint to function where
    throw instruction is located. In case of StepNext we will skip pause
    in this function because StepNext shouldn't break in a deeper frame.

    BUG=chromium:604495
    R=yangguo@chromium.org
    LOG=N

    Review URL: https://codereview.chromium.org/1894263002

    Cr-Commit-Position: refs/heads/master@{#35627}

Fixes: #7219
  • Loading branch information
targos committed Aug 14, 2016
commit 0f22c88dd5febd46da5eb8f6886066c61ffd9817
2 changes: 1 addition & 1 deletion deps/v8/include/v8-version.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
#define V8_MAJOR_VERSION 5
#define V8_MINOR_VERSION 1
#define V8_BUILD_NUMBER 281
#define V8_PATCH_LEVEL 80
#define V8_PATCH_LEVEL 81

// Use 1 for candidates and 0 otherwise.
// (Boolean macro values are not supported by all preprocessors.)
Expand Down
8 changes: 8 additions & 0 deletions deps/v8/src/debug/debug.cc
Original file line number Diff line number Diff line change
Expand Up @@ -962,6 +962,14 @@ void Debug::PrepareStepOnThrow() {
it.Advance();
}

if (last_step_action() == StepNext) {
while (!it.done()) {
Address current_fp = it.frame()->UnpaddedFP();
if (current_fp >= thread_local_.target_fp_) break;
it.Advance();
}
}

// Find the closest Javascript frame we can flood with one-shots.
while (!it.done() &&
!it.frame()->function()->shared()->IsSubjectToDebugging()) {
Expand Down
33 changes: 33 additions & 0 deletions deps/v8/test/cctest/test-debug.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8185,3 +8185,36 @@ TEST(DebugStepNextTailCallEliminiation) {
ExpectString("JSON.stringify(log)",
"[\"a4\",\"b2\",\"c4\",\"e0\",\"e0\",\"e0\",\"e0\",\"f0\"]");
}

size_t current_action = 0;
StepAction actions[] = {StepNext, StepNext};
static void DebugStepOverFunctionWithCaughtExceptionListener(
const v8::Debug::EventDetails& event_details) {
v8::DebugEvent event = event_details.GetEvent();
if (event != v8::Break) return;
++break_point_hit_count;
if (current_action >= 2) return;
PrepareStep(actions[current_action]);
}

TEST(DebugStepOverFunctionWithCaughtException) {
i::FLAG_allow_natives_syntax = true;

DebugLocalContext env;
v8::Isolate* isolate = env->GetIsolate();
v8::HandleScope scope(isolate);
v8::Debug::SetDebugEventListener(
isolate, DebugStepOverFunctionWithCaughtExceptionListener);

break_point_hit_count = 0;
CompileRun(
"function foo() {\n"
" try { throw new Error(); } catch (e) {}\n"
"}\n"
"debugger;\n"
"foo();\n"
"foo();\n");

v8::Debug::SetDebugEventListener(env->GetIsolate(), nullptr);
CHECK_EQ(break_point_hit_count, 4);
}