| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/debug/liveedit.h" | 5 #include "src/debug/liveedit.h" |
| 6 | 6 |
| 7 #include "src/ast/scopeinfo.h" | 7 #include "src/ast/scopeinfo.h" |
| 8 #include "src/ast/scopes.h" | 8 #include "src/ast/scopes.h" |
| 9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
| 10 #include "src/compilation-cache.h" | 10 #include "src/compilation-cache.h" |
| 11 #include "src/compiler.h" | 11 #include "src/compiler.h" |
| 12 #include "src/debug/debug.h" | 12 #include "src/debug/debug.h" |
| 13 #include "src/deoptimizer.h" | 13 #include "src/deoptimizer.h" |
| 14 #include "src/frames-inl.h" | 14 #include "src/frames-inl.h" |
| 15 #include "src/global-handles.h" | 15 #include "src/global-handles.h" |
| 16 #include "src/interpreter/source-position-table.h" |
| 16 #include "src/isolate-inl.h" | 17 #include "src/isolate-inl.h" |
| 17 #include "src/messages.h" | 18 #include "src/messages.h" |
| 18 #include "src/parsing/parser.h" | 19 #include "src/parsing/parser.h" |
| 19 #include "src/v8.h" | 20 #include "src/v8.h" |
| 20 #include "src/v8memory.h" | 21 #include "src/v8memory.h" |
| 21 | 22 |
| 22 namespace v8 { | 23 namespace v8 { |
| 23 namespace internal { | 24 namespace internal { |
| 24 | 25 |
| 25 void SetElementSloppy(Handle<JSObject> object, | 26 void SetElementSloppy(Handle<JSObject> object, |
| (...skipping 1250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1276 } | 1277 } |
| 1277 | 1278 |
| 1278 RelocInfoWriter reloc_info_writer_; | 1279 RelocInfoWriter reloc_info_writer_; |
| 1279 byte* buffer_; | 1280 byte* buffer_; |
| 1280 int buffer_size_; | 1281 int buffer_size_; |
| 1281 | 1282 |
| 1282 static const int kBufferGap = RelocInfoWriter::kMaxSize; | 1283 static const int kBufferGap = RelocInfoWriter::kMaxSize; |
| 1283 static const int kMaximalBufferSize = 512*MB; | 1284 static const int kMaximalBufferSize = 512*MB; |
| 1284 }; | 1285 }; |
| 1285 | 1286 |
| 1286 | 1287 namespace { |
| 1287 // Patch positions in code (changes relocation info section) and possibly | 1288 // Patch positions in code (changes relocation info section) and possibly |
| 1288 // returns new instance of code. | 1289 // returns new instance of code. |
| 1289 static Handle<Code> PatchPositionsInCode( | 1290 Handle<Code> PatchPositionsInCode(Handle<Code> code, |
| 1290 Handle<Code> code, | 1291 Handle<JSArray> position_change_array) { |
| 1291 Handle<JSArray> position_change_array) { | |
| 1292 Isolate* isolate = code->GetIsolate(); | 1292 Isolate* isolate = code->GetIsolate(); |
| 1293 | 1293 |
| 1294 RelocInfoBuffer buffer_writer(code->relocation_size(), | 1294 RelocInfoBuffer buffer_writer(code->relocation_size(), |
| 1295 code->instruction_start()); | 1295 code->instruction_start()); |
| 1296 | 1296 |
| 1297 { | 1297 { |
| 1298 for (RelocIterator it(*code); !it.done(); it.next()) { | 1298 for (RelocIterator it(*code); !it.done(); it.next()) { |
| 1299 RelocInfo* rinfo = it.rinfo(); | 1299 RelocInfo* rinfo = it.rinfo(); |
| 1300 if (RelocInfo::IsPosition(rinfo->rmode())) { | 1300 if (RelocInfo::IsPosition(rinfo->rmode())) { |
| 1301 int position = static_cast<int>(rinfo->data()); | 1301 int position = static_cast<int>(rinfo->data()); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1322 return code; | 1322 return code; |
| 1323 } else { | 1323 } else { |
| 1324 // Relocation info section now has different size. We cannot simply | 1324 // Relocation info section now has different size. We cannot simply |
| 1325 // rewrite it inside code object. Instead we have to create a new | 1325 // rewrite it inside code object. Instead we have to create a new |
| 1326 // code object. | 1326 // code object. |
| 1327 Handle<Code> result(isolate->factory()->CopyCode(code, buffer)); | 1327 Handle<Code> result(isolate->factory()->CopyCode(code, buffer)); |
| 1328 return result; | 1328 return result; |
| 1329 } | 1329 } |
| 1330 } | 1330 } |
| 1331 | 1331 |
| 1332 void PatchPositionsInBytecodeArray(Handle<BytecodeArray> bytecode, |
| 1333 Handle<JSArray> position_change_array) { |
| 1334 Isolate* isolate = bytecode->GetIsolate(); |
| 1335 Zone zone(isolate->allocator()); |
| 1336 interpreter::SourcePositionTableBuilder builder(isolate, &zone); |
| 1337 |
| 1338 for (interpreter::SourcePositionTableIterator iterator( |
| 1339 bytecode->source_position_table()); |
| 1340 !iterator.done(); iterator.Advance()) { |
| 1341 int position = iterator.source_position(); |
| 1342 int new_position = TranslatePosition(position, position_change_array); |
| 1343 builder.AddPosition(iterator.bytecode_offset(), new_position, |
| 1344 iterator.is_statement()); |
| 1345 } |
| 1346 |
| 1347 bytecode->set_source_position_table(*builder.ToSourcePositionTable()); |
| 1348 } |
| 1349 } // namespace |
| 1332 | 1350 |
| 1333 void LiveEdit::PatchFunctionPositions(Handle<JSArray> shared_info_array, | 1351 void LiveEdit::PatchFunctionPositions(Handle<JSArray> shared_info_array, |
| 1334 Handle<JSArray> position_change_array) { | 1352 Handle<JSArray> position_change_array) { |
| 1335 SharedInfoWrapper shared_info_wrapper(shared_info_array); | 1353 SharedInfoWrapper shared_info_wrapper(shared_info_array); |
| 1336 Handle<SharedFunctionInfo> info = shared_info_wrapper.GetInfo(); | 1354 Handle<SharedFunctionInfo> info = shared_info_wrapper.GetInfo(); |
| 1337 | 1355 |
| 1338 int old_function_start = info->start_position(); | 1356 int old_function_start = info->start_position(); |
| 1339 int new_function_start = TranslatePosition(old_function_start, | 1357 int new_function_start = TranslatePosition(old_function_start, |
| 1340 position_change_array); | 1358 position_change_array); |
| 1341 int new_function_end = TranslatePosition(info->end_position(), | 1359 int new_function_end = TranslatePosition(info->end_position(), |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1352 Handle<Code> patched_code = PatchPositionsInCode(Handle<Code>(info->code()), | 1370 Handle<Code> patched_code = PatchPositionsInCode(Handle<Code>(info->code()), |
| 1353 position_change_array); | 1371 position_change_array); |
| 1354 if (*patched_code != info->code()) { | 1372 if (*patched_code != info->code()) { |
| 1355 // Replace all references to the code across the heap. In particular, | 1373 // Replace all references to the code across the heap. In particular, |
| 1356 // some stubs may refer to this code and this code may be being executed | 1374 // some stubs may refer to this code and this code may be being executed |
| 1357 // on stack (it is safe to substitute the code object on stack, because | 1375 // on stack (it is safe to substitute the code object on stack, because |
| 1358 // we only change the structure of rinfo and leave instructions | 1376 // we only change the structure of rinfo and leave instructions |
| 1359 // untouched). | 1377 // untouched). |
| 1360 ReplaceCodeObject(Handle<Code>(info->code()), patched_code); | 1378 ReplaceCodeObject(Handle<Code>(info->code()), patched_code); |
| 1361 } | 1379 } |
| 1380 } else if (info->HasBytecodeArray()) { |
| 1381 PatchPositionsInBytecodeArray(Handle<BytecodeArray>(info->bytecode_array()), |
| 1382 position_change_array); |
| 1362 } | 1383 } |
| 1363 } | 1384 } |
| 1364 | 1385 |
| 1365 | 1386 |
| 1366 static Handle<Script> CreateScriptCopy(Handle<Script> original) { | 1387 static Handle<Script> CreateScriptCopy(Handle<Script> original) { |
| 1367 Isolate* isolate = original->GetIsolate(); | 1388 Isolate* isolate = original->GetIsolate(); |
| 1368 | 1389 |
| 1369 Handle<String> original_source(String::cast(original->source())); | 1390 Handle<String> original_source(String::cast(original->source())); |
| 1370 Handle<Script> copy = isolate->factory()->NewScript(original_source); | 1391 Handle<Script> copy = isolate->factory()->NewScript(original_source); |
| 1371 | 1392 |
| (...skipping 665 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2037 } | 2058 } |
| 2038 } | 2059 } |
| 2039 | 2060 |
| 2040 | 2061 |
| 2041 bool LiveEditFunctionTracker::IsActive(Isolate* isolate) { | 2062 bool LiveEditFunctionTracker::IsActive(Isolate* isolate) { |
| 2042 return isolate->active_function_info_listener() != NULL; | 2063 return isolate->active_function_info_listener() != NULL; |
| 2043 } | 2064 } |
| 2044 | 2065 |
| 2045 } // namespace internal | 2066 } // namespace internal |
| 2046 } // namespace v8 | 2067 } // namespace v8 |
| OLD | NEW |