| Index: src/debug/liveedit.cc
|
| diff --git a/src/debug/liveedit.cc b/src/debug/liveedit.cc
|
| index aa675374b51d88d34e8a0441c1c4b2fd98cb30f1..2a77323d1a5ed5e4faff1b78186972b9c2746014 100644
|
| --- a/src/debug/liveedit.cc
|
| +++ b/src/debug/liveedit.cc
|
| @@ -13,10 +13,10 @@
|
| #include "src/deoptimizer.h"
|
| #include "src/frames-inl.h"
|
| #include "src/global-handles.h"
|
| -#include "src/interpreter/source-position-table.h"
|
| #include "src/isolate-inl.h"
|
| #include "src/messages.h"
|
| #include "src/parsing/parser.h"
|
| +#include "src/source-position-table.h"
|
| #include "src/v8.h"
|
| #include "src/v8memory.h"
|
|
|
| @@ -1196,62 +1196,22 @@ class RelocInfoBuffer {
|
| };
|
|
|
| namespace {
|
| -// Patch positions in code (changes relocation info section) and possibly
|
| -// returns new instance of code.
|
| -Handle<Code> PatchPositionsInCode(Handle<Code> code,
|
| - Handle<JSArray> position_change_array) {
|
| - Isolate* isolate = code->GetIsolate();
|
| -
|
| - RelocInfoBuffer buffer_writer(code->relocation_size(),
|
| - code->instruction_start());
|
| -
|
| - {
|
| - for (RelocIterator it(*code); !it.done(); it.next()) {
|
| - RelocInfo* rinfo = it.rinfo();
|
| - if (RelocInfo::IsPosition(rinfo->rmode())) {
|
| - int position = static_cast<int>(rinfo->data());
|
| - int new_position = TranslatePosition(position,
|
| - position_change_array);
|
| - if (position != new_position) {
|
| - RelocInfo info_copy(rinfo->isolate(), rinfo->pc(), rinfo->rmode(),
|
| - new_position, NULL);
|
| - buffer_writer.Write(&info_copy);
|
| - continue;
|
| - }
|
| - }
|
| - if (RelocInfo::IsRealRelocMode(rinfo->rmode())) {
|
| - buffer_writer.Write(it.rinfo());
|
| - }
|
| - }
|
| - }
|
| -
|
| - Vector<byte> buffer = buffer_writer.GetResult();
|
| - Handle<ByteArray> reloc_info =
|
| - isolate->factory()->NewByteArray(buffer.length(), TENURED);
|
| -
|
| - DisallowHeapAllocation no_gc;
|
| - code->set_relocation_info(*reloc_info);
|
| - CopyBytes(code->relocation_start(), buffer.start(), buffer.length());
|
| - return code;
|
| -}
|
| -
|
| -void PatchPositionsInBytecodeArray(Handle<BytecodeArray> bytecode,
|
| - Handle<JSArray> position_change_array) {
|
| - Isolate* isolate = bytecode->GetIsolate();
|
| +Handle<ByteArray> TranslateSourcePositionTable(
|
| + Handle<ByteArray> source_position_table,
|
| + Handle<JSArray> position_change_array) {
|
| + Isolate* isolate = source_position_table->GetIsolate();
|
| Zone zone(isolate->allocator());
|
| - interpreter::SourcePositionTableBuilder builder(isolate, &zone);
|
| + SourcePositionTableBuilder builder(isolate, &zone);
|
|
|
| - for (interpreter::SourcePositionTableIterator iterator(
|
| - bytecode->source_position_table());
|
| + for (SourcePositionTableIterator iterator(*source_position_table);
|
| !iterator.done(); iterator.Advance()) {
|
| int position = iterator.source_position();
|
| int new_position = TranslatePosition(position, position_change_array);
|
| - builder.AddPosition(iterator.bytecode_offset(), new_position,
|
| + builder.AddPosition(iterator.code_offset(), new_position,
|
| iterator.is_statement());
|
| }
|
|
|
| - Handle<ByteArray> source_position_table = builder.ToSourcePositionTable();
|
| - bytecode->set_source_position_table(*source_position_table);
|
| + return builder.ToSourcePositionTable();
|
| }
|
| } // namespace
|
|
|
| @@ -1273,20 +1233,22 @@ void LiveEdit::PatchFunctionPositions(Handle<JSArray> shared_info_array,
|
| info->set_function_token_position(new_function_token_pos);
|
|
|
| if (info->code()->kind() == Code::FUNCTION) {
|
| - // Patch relocation info section of the code.
|
| - Handle<Code> patched_code = PatchPositionsInCode(Handle<Code>(info->code()),
|
| - position_change_array);
|
| - if (*patched_code != info->code()) {
|
| - // Replace all references to the code across the heap. In particular,
|
| - // some stubs may refer to this code and this code may be being executed
|
| - // on stack (it is safe to substitute the code object on stack, because
|
| - // we only change the structure of rinfo and leave instructions
|
| - // untouched).
|
| - ReplaceCodeObject(Handle<Code>(info->code()), patched_code);
|
| - }
|
| + Handle<ByteArray> new_source_position_table = TranslateSourcePositionTable(
|
| + Handle<ByteArray>(info->code()->source_position_table()),
|
| + position_change_array);
|
| + info->code()->set_source_position_table(*new_source_position_table);
|
| } else if (info->HasBytecodeArray()) {
|
| - PatchPositionsInBytecodeArray(Handle<BytecodeArray>(info->bytecode_array()),
|
| - position_change_array);
|
| + Handle<ByteArray> new_source_position_table = TranslateSourcePositionTable(
|
| + Handle<ByteArray>(info->bytecode_array()->source_position_table()),
|
| + position_change_array);
|
| + info->bytecode_array()->set_source_position_table(
|
| + *new_source_position_table);
|
| + }
|
| +
|
| + if (info->HasDebugInfo()) {
|
| + // Existing break points will be re-applied. Reset the debug info here.
|
| + info->GetIsolate()->debug()->RemoveDebugInfoAndClearFromShared(
|
| + handle(info->GetDebugInfo()));
|
| }
|
| }
|
|
|
|
|