Index: src/liveedit.cc |
diff --git a/src/liveedit.cc b/src/liveedit.cc |
index 22a26a32dc48796739682427c2ed4fb304779676..8e02b5d9e841f419db269efd7ed79d93889547ee 100644 |
--- a/src/liveedit.cc |
+++ b/src/liveedit.cc |
@@ -644,13 +644,28 @@ static Handle<Code> PatchPositionsInCode(Handle<Code> code, |
} |
-void LiveEdit::PatchFunctionPositions(Handle<JSArray> shared_info_array, |
- Handle<JSArray> position_change_array) { |
+static Handle<Object> GetBreakPointObjectsForJS( |
+ Handle<BreakPointInfo> break_point_info) { |
+ if (break_point_info->break_point_objects()->IsFixedArray()) { |
+ Handle<FixedArray> fixed_array( |
+ FixedArray::cast(break_point_info->break_point_objects())); |
+ Handle<Object> array = Factory::NewJSArrayWithElements(fixed_array); |
+ return array; |
+ } else { |
+ return Handle<Object>(break_point_info->break_point_objects()); |
+ } |
+} |
+ |
+ |
+Handle<JSArray> LiveEdit::PatchFunctionPositions( |
+ Handle<JSArray> shared_info_array, Handle<JSArray> position_change_array) { |
SharedInfoWrapper shared_info_wrapper(shared_info_array); |
Handle<SharedFunctionInfo> info = shared_info_wrapper.GetInfo(); |
- info->set_start_position(TranslatePosition(info->start_position(), |
- position_change_array)); |
+ int old_function_start = info->start_position(); |
+ int new_function_start = TranslatePosition(old_function_start, |
+ position_change_array); |
+ info->set_start_position(new_function_start); |
info->set_end_position(TranslatePosition(info->end_position(), |
position_change_array)); |
@@ -672,6 +687,10 @@ void LiveEdit::PatchFunctionPositions(Handle<JSArray> shared_info_array, |
} |
} |
+ |
+ Handle<JSArray> result = Factory::NewJSArray(0); |
+ int result_len = 0; |
+ |
if (info->debug_info()->IsDebugInfo()) { |
Handle<DebugInfo> debug_info(DebugInfo::cast(info->debug_info())); |
Handle<Code> patched_orig_code = |
@@ -690,12 +709,22 @@ void LiveEdit::PatchFunctionPositions(Handle<JSArray> shared_info_array, |
} |
Handle<BreakPointInfo> info( |
BreakPointInfo::cast(break_point_infos->get(i))); |
- int new_position = TranslatePosition(info->source_position()->value(), |
+ int old_in_script_position = info->source_position()->value() + |
+ old_function_start; |
+ int new_in_script_position = TranslatePosition(old_in_script_position, |
position_change_array); |
- info->set_source_position(Smi::FromInt(new_position)); |
+ info->set_source_position( |
+ Smi::FromInt(new_in_script_position - new_function_start)); |
+ if (old_in_script_position != new_in_script_position) { |
+ SetElement(result, result_len, |
+ Handle<Smi>(Smi::FromInt(new_in_script_position))); |
+ SetElement(result, result_len + 1, |
+ GetBreakPointObjectsForJS(info)); |
+ result_len += 2; |
+ } |
} |
} |
- // TODO(635): Also patch breakpoint objects in JS. |
+ return result; |
} |