Index: src/snapshot/serialize.cc |
diff --git a/src/snapshot/serialize.cc b/src/snapshot/serialize.cc |
index 57092e1b46238336fff16a11e9a510324fbceea4..8b382c09fb1a3c047a1c22f02dd2dc3ad9703b42 100644 |
--- a/src/snapshot/serialize.cc |
+++ b/src/snapshot/serialize.cc |
@@ -714,20 +714,16 @@ class StringTableInsertionKey : public HashTableKey { |
HeapObject* Deserializer::PostProcessNewObject(HeapObject* obj, int space) { |
if (deserializing_user_code()) { |
- if (obj->IsString()) { |
+ if (obj->IsInternalizedString()) { |
+ // Canonicalize the internalized string. If it already exists in the |
+ // string table, set it to forward to the existing one. |
+ DisallowHeapAllocation no_gc; |
String* string = String::cast(obj); |
- // Uninitialize hash field as the hash seed may have changed. |
- string->set_hash_field(String::kEmptyHashField); |
- if (string->IsInternalizedString()) { |
- // Canonicalize the internalized string. If it already exists in the |
- // string table, set it to forward to the existing one. |
- DisallowHeapAllocation no_gc; |
- HandleScope scope(isolate_); |
- StringTableInsertionKey key(string); |
- String* canonical = *StringTable::LookupKey(isolate_, &key); |
- string->SetForwardedInternalizedString(canonical); |
- return canonical; |
- } |
+ HandleScope scope(isolate_); |
+ StringTableInsertionKey key(string); |
+ String* canonical = *StringTable::LookupKey(isolate_, &key); |
+ string->SetForwardedInternalizedString(canonical); |
+ return canonical; |
} else if (obj->IsScript()) { |
// Assign a new script id to avoid collision. |
Script::cast(obj)->set_id(isolate_->heap()->NextScriptId()); |
@@ -2304,12 +2300,24 @@ void CodeSerializer::SerializeObject(HeapObject* obj, HowToCode how_to_code, |
void CodeSerializer::SerializeGeneric(HeapObject* heap_object, |
HowToCode how_to_code, |
WhereToPoint where_to_point) { |
- if (heap_object->IsInternalizedString()) num_internalized_strings_++; |
+ int string_hash = String::kEmptyHashField; |
+ if (heap_object->IsString()) { |
+ String* string = String::cast(heap_object); |
+ if (string->IsInternalizedString()) num_internalized_strings_++; |
+ // Temporarily clear string hash. |
+ string_hash = string->hash_field(); |
+ string->set_hash_field(String::kEmptyHashField); |
+ } |
// Object has not yet been serialized. Serialize it here. |
ObjectSerializer serializer(this, heap_object, sink_, how_to_code, |
where_to_point); |
serializer.Serialize(); |
+ |
+ if (string_hash != String::kEmptyHashField) { |
+ // Restore string hash. |
+ String::cast(heap_object)->set_hash_field(String::kEmptyHashField); |
+ } |
} |