| Index: src/debug/debug.cc
 | 
| diff --git a/src/debug/debug.cc b/src/debug/debug.cc
 | 
| index 4556206e5bfa4d4feddaa1b6e558179668036a0e..43ce183aa4a86fcce18ca2dcfbbb91ba22f95d07 100644
 | 
| --- a/src/debug/debug.cc
 | 
| +++ b/src/debug/debug.cc
 | 
| @@ -336,6 +336,13 @@ void BreakLocation::ClearBreakPoint(Handle<Object> break_point_object) {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| +void BreakLocation::ReapplyBreakPoint() {
 | 
| +  // We indeed have a break point here to re-apply.
 | 
| +  DCHECK(HasBreakPoint());
 | 
| +  // The break point is currently not applied to code.
 | 
| +  DCHECK(!IsDebugBreak());
 | 
| +  SetDebugBreak();
 | 
| +}
 | 
|  
 | 
|  void BreakLocation::SetOneShot() {
 | 
|    // Debugger statement always calls debugger. No need to modify it.
 | 
| @@ -356,12 +363,6 @@ void BreakLocation::ClearOneShot() {
 | 
|    // Debugger statement always calls debugger. No need to modify it.
 | 
|    if (IsDebuggerStatement()) return;
 | 
|  
 | 
| -  // If there is a real break point here no more to do.
 | 
| -  if (HasBreakPoint()) {
 | 
| -    DCHECK(IsDebugBreak());
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
|    // Patch code removing debug break.
 | 
|    ClearDebugBreak();
 | 
|    DCHECK(!IsDebugBreak());
 | 
| @@ -1127,13 +1128,28 @@ void Debug::ClearOneShot() {
 | 
|    // The current implementation just runs through all the breakpoints. When the
 | 
|    // last break point for a function is removed that function is automatically
 | 
|    // removed from the list.
 | 
| +  DisallowHeapAllocation no_gc;
 | 
|    for (DebugInfoListNode* node = debug_info_list_; node != NULL;
 | 
|         node = node->next()) {
 | 
| +    Handle<DebugInfo> debug_info = node->debug_info();
 | 
|      for (std::unique_ptr<BreakLocation::Iterator> it(
 | 
| -             BreakLocation::GetIterator(node->debug_info()));
 | 
| +             BreakLocation::GetIterator(debug_info));
 | 
|           !it->Done(); it->Next()) {
 | 
|        it->GetBreakLocation().ClearOneShot();
 | 
|      }
 | 
| +    // Re-apply break points after having cleared everything.
 | 
| +    if (debug_info->break_points()->IsUndefined(isolate_)) continue;
 | 
| +    FixedArray* break_points = debug_info->break_points();
 | 
| +    for (int i = 0; i < break_points->length(); i++) {
 | 
| +      if (break_points->get(i)->IsUndefined(isolate_)) continue;
 | 
| +      BreakPointInfo* break_point_info =
 | 
| +          BreakPointInfo::cast(break_points->get(i));
 | 
| +      if (break_point_info->GetBreakPointCount() == 0) continue;
 | 
| +      BreakLocation break_location = BreakLocation::FromPosition(
 | 
| +          debug_info, break_point_info->source_position(),
 | 
| +          BREAK_POSITION_ALIGNED);
 | 
| +      break_location.ReapplyBreakPoint();
 | 
| +    }
 | 
|    }
 | 
|  }
 | 
|  
 | 
| 
 |