Index: src/serialize.cc |
diff --git a/src/serialize.cc b/src/serialize.cc |
index 20319357ab57cde4d60ca3f9d6c77ae64d67561d..4156dfbf626fef88ebe2ec6c55f84240bf8a869e 100644 |
--- a/src/serialize.cc |
+++ b/src/serialize.cc |
@@ -867,7 +867,7 @@ class StringTableInsertionKey : public HashTableKey { |
}; |
-HeapObject* Deserializer::ProcessObjectFromSerializedCode(HeapObject* obj) { |
+HeapObject* Deserializer::ProcessNewObjectFromSerializedCode(HeapObject* obj) { |
if (obj->IsString()) { |
String* string = String::cast(obj); |
// Uninitialize hash field as the hash seed may have changed. |
@@ -876,13 +876,23 @@ HeapObject* Deserializer::ProcessObjectFromSerializedCode(HeapObject* obj) { |
DisallowHeapAllocation no_gc; |
HandleScope scope(isolate_); |
StringTableInsertionKey key(string); |
- return *StringTable::LookupKey(isolate_, &key); |
+ String* canonical = *StringTable::LookupKey(isolate_, &key); |
+ string->SetForwardedInternalizedString(canonical); |
+ return canonical; |
} |
} |
return obj; |
} |
+Object* Deserializer::ProcessBackRefInSerializedCode(Object* obj) { |
+ if (obj->IsInternalizedString()) { |
+ return String::cast(obj)->GetForwardedInternalizedString(); |
+ } |
+ return obj; |
+} |
+ |
+ |
// This routine writes the new object into the pointer provided and then |
// returns true if the new object was in young space and false otherwise. |
// The reason for this strange interface is that otherwise the object is |
@@ -907,7 +917,7 @@ void Deserializer::ReadObject(int space_number, |
if (obj->IsAllocationSite()) RelinkAllocationSite(AllocationSite::cast(obj)); |
// Fix up strings from serialized user code. |
- if (deserializing_user_code()) obj = ProcessObjectFromSerializedCode(obj); |
+ if (deserializing_user_code()) obj = ProcessNewObjectFromSerializedCode(obj); |
*write_back = obj; |
#ifdef DEBUG |
@@ -972,6 +982,9 @@ void Deserializer::ReadChunk(Object** current, |
} else if (where == kBackref) { \ |
emit_write_barrier = (space_number == NEW_SPACE); \ |
new_object = GetAddressFromEnd(data & kSpaceMask); \ |
+ if (deserializing_user_code()) { \ |
+ new_object = ProcessBackRefInSerializedCode(new_object); \ |
+ } \ |
} else if (where == kBuiltin) { \ |
ASSERT(deserializing_user_code()); \ |
int builtin_id = source_->GetInt(); \ |
@@ -992,6 +1005,9 @@ void Deserializer::ReadChunk(Object** current, |
reinterpret_cast<Address>(current) + skip); \ |
emit_write_barrier = (space_number == NEW_SPACE); \ |
new_object = GetAddressFromEnd(data & kSpaceMask); \ |
+ if (deserializing_user_code()) { \ |
+ new_object = ProcessBackRefInSerializedCode(new_object); \ |
+ } \ |
} \ |
if (within == kInnerPointer) { \ |
if (space_number != CODE_SPACE || new_object->IsCode()) { \ |