diff --git a/deps/v8/include/v8-version.h b/deps/v8/include/v8-version.h index e9d2a7541c5..52125445b4e 100644 --- a/deps/v8/include/v8-version.h +++ b/deps/v8/include/v8-version.h @@ -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.) diff --git a/deps/v8/src/debug/debug.cc b/deps/v8/src/debug/debug.cc index 7c76742bb97..cb2d8648aab 100644 --- a/deps/v8/src/debug/debug.cc +++ b/deps/v8/src/debug/debug.cc @@ -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()) { diff --git a/deps/v8/test/cctest/test-debug.cc b/deps/v8/test/cctest/test-debug.cc index ab27f394e9a..192dce7b9f6 100644 --- a/deps/v8/test/cctest/test-debug.cc +++ b/deps/v8/test/cctest/test-debug.cc @@ -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); +}