| Index: src/debug/debug.cc | 
| diff --git a/src/debug/debug.cc b/src/debug/debug.cc | 
| index 4556206e5bfa4d4feddaa1b6e558179668036a0e..733ea9b02dbb0c9c1dd362645abbd20941a0a401 100644 | 
| --- a/src/debug/debug.cc | 
| +++ b/src/debug/debug.cc | 
| @@ -321,14 +321,14 @@ void BreakLocation::SetBreakPoint(Handle<Object> break_point_object) { | 
| if (!HasBreakPoint()) SetDebugBreak(); | 
| DCHECK(IsDebugBreak() || IsDebuggerStatement()); | 
| // Set the break point information. | 
| -  DebugInfo::SetBreakPoint(debug_info_, code_offset_, position_, | 
| -                           statement_position_, break_point_object); | 
| +  DebugInfo::SetBreakPoint(debug_info_, position_, statement_position_, | 
| +                           break_point_object); | 
| } | 
|  | 
|  | 
| void BreakLocation::ClearBreakPoint(Handle<Object> break_point_object) { | 
| // Clear the break point information. | 
| -  DebugInfo::ClearBreakPoint(debug_info_, code_offset_, break_point_object); | 
| +  DebugInfo::ClearBreakPoint(debug_info_, position_, break_point_object); | 
| // If there are no more break points here remove the debug break. | 
| if (!HasBreakPoint()) { | 
| ClearDebugBreak(); | 
| @@ -341,12 +341,6 @@ void BreakLocation::SetOneShot() { | 
| // 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 with debug break. | 
| SetDebugBreak(); | 
| } | 
| @@ -435,9 +429,19 @@ bool BreakLocation::IsDebugBreak() const { | 
| } | 
| } | 
|  | 
| - | 
| Handle<Object> BreakLocation::BreakPointObjects() const { | 
| -  return debug_info_->GetBreakPointObjects(code_offset_); | 
| +  return debug_info_->GetBreakPointObjects(position_); | 
| +} | 
| + | 
| +bool BreakLocation::HasBreakPoint() const { | 
| +  // First check whether there is a break point with the same source position. | 
| +  if (!debug_info_->HasBreakPoint(position_)) return false; | 
| +  // Then check whether a break point at that source position would have | 
| +  // the same code offset. Otherwise it's just a break location that we can | 
| +  // step to, but not actually a location where we can put a break point. | 
| +  BreakLocation break_point_location = BreakLocation::FromPosition( | 
| +      debug_info_, position_, BREAK_POSITION_ALIGNED); | 
| +  return break_point_location.code_offset() == code_offset_; | 
| } | 
|  | 
| void DebugFeatureTracker::Track(DebugFeatureTracker::Feature feature) { | 
| @@ -830,8 +834,9 @@ void Debug::ClearBreakPoint(Handle<Object> break_point_object) { | 
| Handle<BreakPointInfo>::cast(result); | 
| Handle<DebugInfo> debug_info = node->debug_info(); | 
|  | 
| -      BreakLocation location = BreakLocation::FromCodeOffset( | 
| -          debug_info, break_point_info->code_offset()); | 
| +      BreakLocation location = BreakLocation::FromPosition( | 
| +          debug_info, break_point_info->source_position(), | 
| +          BREAK_POSITION_ALIGNED); | 
| location.ClearBreakPoint(break_point_object); | 
|  | 
| // If there are no more break points left remove the debug info for this | 
| @@ -1094,13 +1099,14 @@ Handle<Object> Debug::GetSourceBreakLocations( | 
| int break_points = break_point_info->GetBreakPointCount(); | 
| if (break_points == 0) continue; | 
| Smi* position = NULL; | 
| -      switch (position_alignment) { | 
| -        case STATEMENT_ALIGNED: | 
| -          position = Smi::FromInt(break_point_info->statement_position()); | 
| -          break; | 
| -        case BREAK_POSITION_ALIGNED: | 
| -          position = Smi::FromInt(break_point_info->source_position()); | 
| -          break; | 
| +      if (position_alignment == STATEMENT_ALIGNED) { | 
| +        BreakLocation break_point_location = BreakLocation::FromPosition( | 
| +            debug_info, break_point_info->source_position(), | 
| +            BREAK_POSITION_ALIGNED); | 
| +        position = Smi::FromInt(break_point_location.statement_position()); | 
| +      } else { | 
| +        DCHECK_EQ(BREAK_POSITION_ALIGNED, position_alignment); | 
| +        position = Smi::FromInt(break_point_info->source_position()); | 
| } | 
| for (int j = 0; j < break_points; ++j) locations->set(count++, position); | 
| } | 
|  |