Index: src/debug/debug.cc |
diff --git a/src/debug/debug.cc b/src/debug/debug.cc |
index 347d9b6b6d668b3fcea88460947a4755a4269fd8..4114e757409d7484d705d9693090964e052d8628 100644 |
--- a/src/debug/debug.cc |
+++ b/src/debug/debug.cc |
@@ -168,6 +168,18 @@ void BreakLocation::FromAddressSameStatement(Handle<DebugInfo> debug_info, |
} |
+// Find all break locations with the given statement position. |
+void BreakLocation::AllForStatementPosition(Handle<DebugInfo> debug_info, |
+ int statement_position, |
+ List<BreakLocation>* result_out) { |
+ for (Iterator it(debug_info, ALL_BREAK_LOCATIONS); !it.Done(); it.Next()) { |
+ if (it.statement_position() == statement_position) { |
+ result_out->Add(it.GetBreakLocation()); |
+ } |
+ } |
+} |
+ |
+ |
int BreakLocation::BreakIndexFromAddress(Handle<DebugInfo> debug_info, |
Address pc) { |
// Run through all break points to locate the one closest to the address. |
@@ -536,11 +548,11 @@ Handle<Object> Debug::CheckBreakPoints(BreakLocation* location, |
bool Debug::IsMutedAtCurrentLocation(JavaScriptFrame* frame) { |
- // A break location is considered muted if the break location has break |
- // points, but their conditions all evaluate to false. |
- // Aside from not triggering a debug break event at the break location, |
- // we also do not trigger one for debugger statements, nor an exception event |
- // on exception at this location. |
+ // A break location is considered muted if break locations on the current |
+ // statement have at least one break point, and all of these break points |
+ // evaluate to false. Aside from not triggering a debug break event at the |
+ // break location, we also do not trigger one for debugger statements, nor |
+ // an exception event on exception at this location. |
Object* fun = frame->function(); |
if (!fun->IsJSFunction()) return false; |
JSFunction* function = JSFunction::cast(fun); |
@@ -550,10 +562,19 @@ bool Debug::IsMutedAtCurrentLocation(JavaScriptFrame* frame) { |
// Enter the debugger. |
DebugScope debug_scope(this); |
if (debug_scope.failed()) return false; |
- BreakLocation location = BreakLocation::FromFrame(debug_info, frame); |
- bool has_break_points; |
- Handle<Object> check_result = CheckBreakPoints(&location, &has_break_points); |
- return has_break_points && check_result->IsUndefined(); |
+ BreakLocation current_position = BreakLocation::FromFrame(debug_info, frame); |
+ List<BreakLocation> break_locations; |
+ BreakLocation::AllForStatementPosition( |
+ debug_info, current_position.statement_position(), &break_locations); |
+ bool has_break_points_at_all = false; |
+ for (int i = 0; i < break_locations.length(); i++) { |
+ bool has_break_points; |
+ Handle<Object> check_result = |
+ CheckBreakPoints(&break_locations[i], &has_break_points); |
+ has_break_points_at_all |= has_break_points; |
+ if (has_break_points && !check_result->IsUndefined()) return false; |
+ } |
+ return has_break_points_at_all; |
} |