Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(99)

Unified Diff: src/debug/debug.cc

Issue 2758483002: [debugger] tuned StepNext and StepOut at return position (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/debug/debug.cc
diff --git a/src/debug/debug.cc b/src/debug/debug.cc
index 8c85e4b2497f66317f7152ed786b977056d76557..3e344efb6149ba4565b62196fb50d011791845eb 100644
--- a/src/debug/debug.cc
+++ b/src/debug/debug.cc
@@ -386,6 +386,7 @@ void Debug::ThreadInit() {
thread_local_.break_count_ = 0;
thread_local_.break_id_ = 0;
thread_local_.break_frame_id_ = StackFrame::NO_ID;
+ thread_local_.last_step_frame_id_ = StackFrame::NO_ID;
thread_local_.last_step_action_ = StepNone;
thread_local_.last_statement_position_ = kNoSourcePosition;
thread_local_.last_frame_count_ = -1;
@@ -876,10 +877,22 @@ MaybeHandle<FixedArray> Debug::GetHitBreakPointObjects(
}
void Debug::PrepareStepIn(Handle<JSFunction> function) {
- CHECK(last_step_action() >= StepIn);
+ CHECK(last_step_action() != StepNone);
if (ignore_events()) return;
if (in_debug_scope()) return;
if (break_disabled()) return;
+ if (last_step_action() == StepIn) {
+ FloodWithOneShot(Handle<SharedFunctionInfo>(function->shared(), isolate_));
+ }
+ if (thread_local_.last_step_frame_id_ == StackFrame::NO_ID) return;
+ if (last_step_action() == StepOut || last_step_action() == StepNext) {
+ int count = 0;
+ for (StackTraceFrameIterator it(isolate_); !it.done(); it.Advance()) {
+ if (it.frame()->id() == thread_local_.last_step_frame_id_) return;
+ ++count;
+ }
+ thread_local_.target_frame_count_ = count + 1;
+ }
FloodWithOneShot(Handle<SharedFunctionInfo>(function->shared(), isolate_));
}
@@ -990,6 +1003,10 @@ void Debug::PrepareStep(StepAction step_action) {
StackTraceFrameIterator frames_it(isolate_, frame_id);
StandardFrame* frame = frames_it.frame();
+ if (step_action == StepOut || step_action == StepNext) {
+ thread_local_.last_step_frame_id_ = frame->id();
+ }
+
// Handle stepping in wasm functions via the wasm interpreter.
if (frame->is_wasm()) {
// If the top frame is compiled, we cannot step.
@@ -1124,6 +1141,7 @@ void Debug::ClearStepping() {
thread_local_.last_step_action_ = StepNone;
thread_local_.last_statement_position_ = kNoSourcePosition;
+ thread_local_.last_step_frame_id_ = StackFrame::NO_ID;
thread_local_.last_frame_count_ = -1;
thread_local_.target_frame_count_ = -1;
UpdateHookOnFunctionCall();
@@ -2109,7 +2127,7 @@ void Debug::UpdateState() {
void Debug::UpdateHookOnFunctionCall() {
STATIC_ASSERT(LastStepAction == StepIn);
- hook_on_function_call_ = thread_local_.last_step_action_ == StepIn ||
+ hook_on_function_call_ = thread_local_.last_step_action_ != StepNone ||
isolate_->needs_side_effect_check();
}

Powered by Google App Engine
This is Rietveld 408576698