Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index 10de6f9e5ec001c595a0b86632599f9be9a22074..72c70f686634e797ca5581b3b44b8a745a075d41 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -12019,6 +12019,10 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetStepInPositions) { |
// Get the frame where the debugging is performed. |
StackFrame::Id id = UnwrapFrameId(wrapped_id); |
JavaScriptFrameIterator frame_it(isolate, id); |
+ if (frame_it.done()) { |
Yang
2013/08/26 13:52:02
you could use RUNTIME_CHECK(!frame_it.done()) here
Peter.Rybin
2013/08/31 16:58:07
I guess you meant RUNTIME_ASSERT
Done
|
+ return isolate->ThrowIllegalOperation(); |
+ } |
+ |
JavaScriptFrame* frame = frame_it.frame(); |
Handle<JSFunction> fun = |
@@ -12038,11 +12042,28 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetStepInPositions) { |
BreakLocationIterator break_location_iterator(debug_info, |
ALL_BREAK_LOCATIONS); |
- break_location_iterator.FindBreakLocationFromAddress(frame->pc()); |
+ break_location_iterator.FindBreakLocationFromAddress(frame->pc() - 1); |
int current_statement_pos = break_location_iterator.statement_position(); |
while (!break_location_iterator.Done()) { |
+ bool accept; |
if (break_location_iterator.pc() > frame->pc()) { |
+ accept = true; |
+ } else { |
+ StackFrame::Id break_frame_id = isolate->debug()->break_frame_id(); |
+ // The break point is near our pc. Could be a step-in possibility, |
+ // that is currently taken by active debugger call. |
+ if (break_frame_id == StackFrame::NO_ID) { |
+ // We are not stepping. |
+ accept = false; |
+ } else { |
+ JavaScriptFrameIterator additional_frame_it(isolate, break_frame_id); |
+ // If our frame is a top frame and we are stepping, we can do step-in |
+ // at this place. |
+ accept = additional_frame_it.frame()->id() == id; |
+ } |
+ } |
+ if (accept) { |
if (break_location_iterator.IsStepInLocation(isolate)) { |
Smi* position_value = Smi::FromInt(break_location_iterator.position()); |
JSObject::SetElement(array, len, |