Index: src/snapshot/deserializer.cc |
diff --git a/src/snapshot/deserializer.cc b/src/snapshot/deserializer.cc |
index 68d34896f8b17deedff6214647d6b7c4c28cc75a..9e8fdc08d04287e5a59ee40548d64e2a9a3e2dd6 100644 |
--- a/src/snapshot/deserializer.cc |
+++ b/src/snapshot/deserializer.cc |
@@ -37,9 +37,17 @@ void Deserializer::FlushICacheForNewIsolate() { |
} |
} |
-void Deserializer::FlushICacheForNewCodeObjects() { |
+void Deserializer::FlushICacheForNewCodeObjectsAndRecordEmbeddedObjects() { |
DCHECK(deserializing_user_code_); |
for (Code* code : new_code_objects_) { |
+ // Record all references to embedded objects in the new code object. |
+ for (RelocIterator it(code, |
+ RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT)); |
+ !it.done(); it.next()) { |
+ isolate_->heap()->RecordWriteIntoCode(code, it.rinfo(), |
Yang
2016/08/03 12:29:52
This entire for loop is duplicate code from CopyCo
ahaas
2016/08/04 08:54:11
Done.
|
+ it.rinfo()->target_object()); |
+ } |
+ |
if (FLAG_serialize_age_code) code->PreAge(isolate_); |
Assembler::FlushICache(isolate_, code->instruction_start(), |
code->instruction_size()); |
@@ -147,7 +155,7 @@ MaybeHandle<SharedFunctionInfo> Deserializer::DeserializeCode( |
Object* root; |
VisitPointer(&root); |
DeserializeDeferredObjects(); |
- FlushICacheForNewCodeObjects(); |
+ FlushICacheForNewCodeObjectsAndRecordEmbeddedObjects(); |
result = Handle<SharedFunctionInfo>(SharedFunctionInfo::cast(root)); |
isolate->heap()->RegisterReservationsForBlackAllocation(reservations_); |
} |