| 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()) { \
|
|
|