Index: src/debug/debug.cc |
diff --git a/src/debug/debug.cc b/src/debug/debug.cc |
index ac2c99eba1c612cc153d83d91a2b4d51957583c2..39b2fb08aaa27ecba17c81911b492409a304e812 100644 |
--- a/src/debug/debug.cc |
+++ b/src/debug/debug.cc |
@@ -59,15 +59,12 @@ Debug::Debug(Isolate* isolate) |
ThreadInit(); |
} |
-BreakLocation BreakLocation::FromFrame(StandardFrame* frame) { |
- // TODO(clemensh): Handle Wasm frames. |
- DCHECK(!frame->is_wasm()); |
- |
- auto summary = FrameSummary::GetFirst(frame).AsJavaScript(); |
+BreakLocation BreakLocation::FromFrame(Handle<DebugInfo> debug_info, |
+ JavaScriptFrame* frame) { |
+ auto summary = FrameSummary::GetTop(frame).AsJavaScript(); |
int offset = summary.code_offset(); |
Handle<AbstractCode> abstract_code = summary.abstract_code(); |
if (abstract_code->IsCode()) offset = offset - 1; |
- Handle<DebugInfo> debug_info(summary.function()->shared()->GetDebugInfo()); |
auto it = BreakIterator::GetIterator(debug_info, abstract_code); |
it->SkipTo(BreakIndexFromCodeOffset(debug_info, abstract_code, offset)); |
return it->GetBreakLocation(); |
@@ -76,7 +73,7 @@ BreakLocation BreakLocation::FromFrame(StandardFrame* frame) { |
void BreakLocation::AllAtCurrentStatement(Handle<DebugInfo> debug_info, |
JavaScriptFrame* frame, |
List<BreakLocation>* result_out) { |
- auto summary = FrameSummary::GetFirst(frame).AsJavaScript(); |
+ auto summary = FrameSummary::GetTop(frame).AsJavaScript(); |
int offset = summary.code_offset(); |
Handle<AbstractCode> abstract_code = summary.abstract_code(); |
if (abstract_code->IsCode()) offset = offset - 1; |
@@ -521,18 +518,14 @@ void Debug::Break(JavaScriptFrame* frame) { |
Handle<JSFunction> function(frame->function()); |
Handle<SharedFunctionInfo> shared(function->shared()); |
if (!EnsureDebugInfo(shared, function)) return; |
+ Handle<DebugInfo> debug_info(shared->GetDebugInfo(), isolate_); |
- BreakLocation location = BreakLocation::FromFrame(frame); |
+ // Find the break location where execution has stopped. |
+ BreakLocation location = BreakLocation::FromFrame(debug_info, frame); |
// Find actual break points, if any, and trigger debug break event. |
- MaybeHandle<FixedArray> break_points_hit; |
- if (break_points_active()) { |
- // Get the debug info, which must exist if we reach here. |
- Handle<DebugInfo> debug_info(shared->GetDebugInfo(), isolate_); |
- |
- break_points_hit = CheckBreakPoints(debug_info, &location); |
- } |
- |
+ MaybeHandle<FixedArray> break_points_hit = |
+ CheckBreakPoints(debug_info, &location); |
if (!break_points_hit.is_null()) { |
// Clear all current stepping setup. |
ClearStepping(); |
@@ -565,7 +558,7 @@ void Debug::Break(JavaScriptFrame* frame) { |
step_break = location.IsTailCall(); |
// Fall through. |
case StepIn: { |
- FrameSummary summary = FrameSummary::GetFirst(frame); |
+ FrameSummary summary = FrameSummary::GetTop(frame); |
step_break = step_break || location.IsReturn() || current_fp != last_fp || |
thread_local_.last_statement_position_ != |
summary.SourceStatementPosition(); |
@@ -1014,7 +1007,7 @@ void Debug::PrepareStep(StepAction step_action) { |
} |
// Get the debug info (create it if it does not exist). |
- auto summary = FrameSummary::GetFirst(frame).AsJavaScript(); |
+ auto summary = FrameSummary::GetTop(frame).AsJavaScript(); |
Handle<JSFunction> function(summary.function()); |
Handle<SharedFunctionInfo> shared(function->shared()); |
if (!EnsureDebugInfo(shared, function)) { |
@@ -1022,7 +1015,8 @@ void Debug::PrepareStep(StepAction step_action) { |
return; |
} |
- BreakLocation location = BreakLocation::FromFrame(frame); |
+ Handle<DebugInfo> debug_info(shared->GetDebugInfo()); |
+ BreakLocation location = BreakLocation::FromFrame(debug_info, frame); |
// Any step at a return is a step-out. |
if (location.IsReturn()) step_action = StepOut; |
@@ -1589,11 +1583,15 @@ void Debug::SetAfterBreakTarget(JavaScriptFrame* frame) { |
bool Debug::IsBreakAtReturn(JavaScriptFrame* frame) { |
HandleScope scope(isolate_); |
+ // Get the executing function in which the debug break occurred. |
+ Handle<SharedFunctionInfo> shared(frame->function()->shared()); |
+ |
// With no debug info there are no break points, so we can't be at a return. |
- if (!frame->function()->shared()->HasDebugInfo()) return false; |
+ if (!shared->HasDebugInfo()) return false; |
DCHECK(!frame->is_optimized()); |
- BreakLocation location = BreakLocation::FromFrame(frame); |
+ Handle<DebugInfo> debug_info(shared->GetDebugInfo()); |
+ BreakLocation location = BreakLocation::FromFrame(debug_info, frame); |
return location.IsReturn() || location.IsTailCall(); |
} |
@@ -2287,7 +2285,7 @@ void Debug::PrintBreakLocation() { |
JavaScriptFrameIterator iterator(isolate_); |
if (iterator.done()) return; |
JavaScriptFrame* frame = iterator.frame(); |
- FrameSummary summary = FrameSummary::GetFirst(frame); |
+ FrameSummary summary = FrameSummary::GetTop(frame); |
int source_position = summary.SourcePosition(); |
Handle<Object> script_obj = summary.script(); |
PrintF("[debug] break in function '"); |