Index: src/snapshot/serializer.cc |
diff --git a/src/snapshot/serializer.cc b/src/snapshot/serializer.cc |
index e826a29fd32b282a12ff82b1572dc663f1377d09..625958812fecc072bf7c32d32aa94b64afd38bca 100644 |
--- a/src/snapshot/serializer.cc |
+++ b/src/snapshot/serializer.cc |
@@ -410,57 +410,17 @@ void Serializer::ObjectSerializer::SerializeExternalString() { |
// their resources. |
SerializeExternalStringAsSequentialString(); |
} else { |
- DCHECK(object_->IsExternalOneByteString()); |
- DCHECK(ExternalOneByteString::cast(object_)->is_short()); |
- int size = object_->Size(); |
- Map* map = object_->map(); |
- AllocationSpace space = |
- MemoryChunk::FromAddress(object_->address())->owner()->identity(); |
- SerializePrologue(space, size, map); |
- // Serialize the rest of the object. |
- CHECK_EQ(0, bytes_processed_so_far_); |
- bytes_processed_so_far_ = kPointerSize; |
- typedef v8::String::ExternalOneByteStringResource Resource; |
- Resource** resource_pointer = reinterpret_cast<Resource**>( |
- HeapObject::RawField(object_, ExternalString::kResourceOffset)); |
- |
- Address references_start = reinterpret_cast<Address>(resource_pointer); |
- OutputRawData(references_start); |
- if (!SerializeExternalNativeSourceString( |
- Natives::GetBuiltinsCount(), resource_pointer, |
- Natives::GetSourceCache(heap), kNativesStringResource)) { |
- bool result = SerializeExternalNativeSourceString( |
- ExtraNatives::GetBuiltinsCount(), resource_pointer, |
- ExtraNatives::GetSourceCache(heap), kExtraNativesStringResource); |
- // One of the strings in the natives cache should match the resource. We |
- // don't expect any other kinds of external strings here. |
- USE(result); |
- DCHECK(result); |
- } |
- OutputRawData(object_->address() + size); |
- } |
-} |
- |
-bool Serializer::ObjectSerializer::SerializeExternalNativeSourceString( |
- int builtin_count, |
- v8::String::ExternalOneByteStringResource** resource_pointer, |
- FixedArray* source_cache, int resource_index) { |
- Isolate* isolate = serializer_->isolate(); |
- for (int i = 0; i < builtin_count; i++) { |
- Object* source = source_cache->get(i); |
- if (!source->IsUndefined(isolate)) { |
- ExternalOneByteString* string = ExternalOneByteString::cast(source); |
- typedef v8::String::ExternalOneByteStringResource Resource; |
- const Resource* resource = string->resource(); |
- if (resource == *resource_pointer) { |
- sink_->Put(resource_index, "NativesStringResource"); |
- sink_->PutSection(i, "NativesStringResourceEnd"); |
- bytes_processed_so_far_ += sizeof(resource); |
- return true; |
- } |
- } |
+ ExternalOneByteString* string = ExternalOneByteString::cast(object_); |
+ DCHECK(string->is_short()); |
+ const NativesExternalStringResource* resource = |
+ reinterpret_cast<const NativesExternalStringResource*>( |
+ string->resource()); |
+ // Replace the resource field with the type and index of the native source. |
+ string->set_resource(resource->EncodeForSerialization()); |
+ SerializeContent(); |
+ // Restore the resource field. |
+ string->set_resource(resource); |
} |
- return false; |
} |
void Serializer::ObjectSerializer::SerializeExternalStringAsSequentialString() { |
@@ -566,43 +526,48 @@ void Serializer::ObjectSerializer::Serialize() { |
if (object_->IsExternalString()) { |
SerializeExternalString(); |
- } else { |
- // We cannot serialize typed array objects correctly. |
- DCHECK(!object_->IsJSTypedArray()); |
+ return; |
+ } |
- // We don't expect fillers. |
- DCHECK(!object_->IsFiller()); |
+ // We cannot serialize typed array objects correctly. |
+ DCHECK(!object_->IsJSTypedArray()); |
- if (object_->IsScript()) { |
- // Clear cached line ends. |
- Object* undefined = serializer_->isolate()->heap()->undefined_value(); |
- Script::cast(object_)->set_line_ends(undefined); |
- } |
+ // We don't expect fillers. |
+ DCHECK(!object_->IsFiller()); |
- int size = object_->Size(); |
- Map* map = object_->map(); |
- AllocationSpace space = |
- MemoryChunk::FromAddress(object_->address())->owner()->identity(); |
- SerializePrologue(space, size, map); |
- |
- // Serialize the rest of the object. |
- CHECK_EQ(0, bytes_processed_so_far_); |
- bytes_processed_so_far_ = kPointerSize; |
- |
- RecursionScope recursion(serializer_); |
- // Objects that are immediately post processed during deserialization |
- // cannot be deferred, since post processing requires the object content. |
- if (recursion.ExceedsMaximum() && CanBeDeferred(object_)) { |
- serializer_->QueueDeferredObject(object_); |
- sink_->Put(kDeferred, "Deferring object content"); |
- return; |
- } |
+ if (object_->IsScript()) { |
+ // Clear cached line ends. |
+ Object* undefined = serializer_->isolate()->heap()->undefined_value(); |
+ Script::cast(object_)->set_line_ends(undefined); |
+ } |
- UnlinkWeakNextScope unlink_weak_next(object_); |
+ SerializeContent(); |
+} |
- object_->IterateBody(map->instance_type(), size, this); |
- OutputRawData(object_->address() + size); |
+void Serializer::ObjectSerializer::SerializeContent() { |
+ int size = object_->Size(); |
+ Map* map = object_->map(); |
+ AllocationSpace space = |
+ MemoryChunk::FromAddress(object_->address())->owner()->identity(); |
+ SerializePrologue(space, size, map); |
+ |
+ // Serialize the rest of the object. |
+ CHECK_EQ(0, bytes_processed_so_far_); |
+ bytes_processed_so_far_ = kPointerSize; |
+ |
+ RecursionScope recursion(serializer_); |
+ // Objects that are immediately post processed during deserialization |
+ // cannot be deferred, since post processing requires the object content. |
+ if (recursion.ExceedsMaximum() && CanBeDeferred(object_)) { |
+ serializer_->QueueDeferredObject(object_); |
+ sink_->Put(kDeferred, "Deferring object content"); |
+ return; |
} |
+ |
+ UnlinkWeakNextScope unlink_weak_next(object_); |
+ |
+ object_->IterateBody(map->instance_type(), size, this); |
+ OutputRawData(object_->address() + size); |
} |
void Serializer::ObjectSerializer::SerializeDeferred() { |