Index: src/runtime/runtime-debug.cc |
diff --git a/src/runtime/runtime-debug.cc b/src/runtime/runtime-debug.cc |
index 9d69294fea88da0512ec20a7945e42796e7a762e..7c5546913756762c181d94dc9d85f2665948910a 100644 |
--- a/src/runtime/runtime-debug.cc |
+++ b/src/runtime/runtime-debug.cc |
@@ -1164,18 +1164,19 @@ class ScopeIterator { |
if (!ignore_nested_scopes) { |
Handle<DebugInfo> debug_info = Debug::GetDebugInfo(shared_info); |
- // Find the break point where execution has stopped. |
- BreakLocationIterator break_location_iterator(debug_info, |
- ALL_BREAK_LOCATIONS); |
- // pc points to the instruction after the current one, possibly a break |
+ // PC points to the instruction after the current one, possibly a break |
// location as well. So the "- 1" to exclude it from the search. |
- break_location_iterator.FindBreakLocationFromAddress(frame->pc() - 1); |
+ Address call_pc = frame->pc() - 1; |
+ |
+ // Find the break point where execution has stopped. |
+ BreakLocation location = |
+ BreakLocation::FromAddress(debug_info, ALL_BREAK_LOCATIONS, call_pc); |
// Within the return sequence at the moment it is not possible to |
// get a source position which is consistent with the current scope chain. |
// Thus all nested with, catch and block contexts are skipped and we only |
// provide the function scope. |
- ignore_nested_scopes = break_location_iterator.IsExit(); |
+ ignore_nested_scopes = location.IsExit(); |
} |
if (ignore_nested_scopes) { |
@@ -1559,18 +1560,19 @@ RUNTIME_FUNCTION(Runtime_GetStepInPositions) { |
Handle<DebugInfo> debug_info = Debug::GetDebugInfo(shared); |
- int len = 0; |
- Handle<JSArray> array(isolate->factory()->NewJSArray(10)); |
- // Find the break point where execution has stopped. |
- BreakLocationIterator break_location_iterator(debug_info, |
- ALL_BREAK_LOCATIONS); |
+ // Find range of break points starting from the break point where execution |
+ // has stopped. |
+ Address call_pc = frame->pc() - 1; |
+ List<BreakLocation> locations; |
+ BreakLocation::FromAddressSameStatement(debug_info, ALL_BREAK_LOCATIONS, |
+ call_pc, &locations); |
- break_location_iterator.FindBreakLocationFromAddress(frame->pc() - 1); |
- int current_statement_pos = break_location_iterator.statement_position(); |
+ Handle<JSArray> array = isolate->factory()->NewJSArray(locations.length()); |
- while (!break_location_iterator.Done()) { |
+ int index = 0; |
+ for (BreakLocation location : locations) { |
bool accept; |
- if (break_location_iterator.pc() > frame->pc()) { |
+ if (location.pc() > frame->pc()) { |
accept = true; |
} else { |
StackFrame::Id break_frame_id = isolate->debug()->break_frame_id(); |
@@ -1587,20 +1589,15 @@ RUNTIME_FUNCTION(Runtime_GetStepInPositions) { |
} |
} |
if (accept) { |
- if (break_location_iterator.IsStepInLocation(isolate)) { |
- Smi* position_value = Smi::FromInt(break_location_iterator.position()); |
+ if (location.IsStepInLocation()) { |
+ Smi* position_value = Smi::FromInt(location.position()); |
RETURN_FAILURE_ON_EXCEPTION( |
isolate, JSObject::SetElement( |
- array, len, Handle<Object>(position_value, isolate), |
+ array, index, Handle<Object>(position_value, isolate), |
NONE, SLOPPY)); |
- len++; |
+ index++; |
} |
} |
- // Advance iterator. |
- break_location_iterator.Next(); |
- if (current_statement_pos != break_location_iterator.statement_position()) { |
- break; |
- } |
} |
return *array; |
} |