Chromium Code Reviews| Index: src/serialize.cc |
| diff --git a/src/serialize.cc b/src/serialize.cc |
| index 05a54188b86cfbeef9bc010a083fcad001d9adb5..8f3888cc431f6ee753f4f4b66b3b9e91c5876e89 100644 |
| --- a/src/serialize.cc |
| +++ b/src/serialize.cc |
| @@ -706,8 +706,8 @@ MaybeHandle<Object> Deserializer::DeserializePartial( |
| return MaybeHandle<Object>(); |
| } |
| - Vector<Handle<Object> > attached_objects = Vector<Handle<Object> >::New(1); |
| - attached_objects[kGlobalProxyReference] = global_proxy; |
| + Handle<Object> global_proxy_object = global_proxy; |
| + Vector<Handle<Object> > attached_objects(&global_proxy_object, 1); |
| SetAttachedObjects(attached_objects); |
|
vogelheim
2015/02/25 14:00:19
I don't get this. My understanding is:
- SetAttac
Yang
2015/02/25 16:06:21
You are right. It will indeed go out of scope, tho
|
| DisallowHeapAllocation no_gc; |
| @@ -753,7 +753,6 @@ Deserializer::~Deserializer() { |
| delete external_reference_decoder_; |
| external_reference_decoder_ = NULL; |
| } |
| - attached_objects_.Dispose(); |
| } |
| @@ -1378,6 +1377,7 @@ Serializer::Serializer(Isolate* isolate, SnapshotByteSink* sink) |
| Serializer::~Serializer() { |
| delete external_reference_encoder_; |
| if (code_address_map_ != NULL) delete code_address_map_; |
| + code_buffer_.Dispose(); |
| } |
| @@ -2044,14 +2044,16 @@ void Serializer::ObjectSerializer::VisitExternalOneByteString( |
| } |
| -static Code* CloneCodeObject(HeapObject* code) { |
| - Address copy = new byte[code->Size()]; |
| - MemCopy(copy, code->address(), code->Size()); |
| - return Code::cast(HeapObject::FromAddress(copy)); |
| -} |
| - |
| - |
| -static void WipeOutRelocations(Code* code) { |
| +Address Serializer::ObjectSerializer::PrepareCode() { |
| + // To make snapshots reproducible, we make a copy of the code object |
| + // and wipe all pointers in the copy, which we then serialize. |
| + Code* original = Code::cast(object_); |
| + int size = original->CodeSize(); |
| + Address copy = serializer_->GetCodeBuffer(size); |
| + MemCopy(copy, original->address(), size); |
| + Code* code = Code::cast(HeapObject::FromAddress(copy)); |
| + // Code age headers are not serializable. |
| + code->MakeYoung(serializer_->isolate()); |
| int mode_mask = |
| RelocInfo::kCodeTargetMask | |
| RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) | |
| @@ -2062,6 +2064,10 @@ static void WipeOutRelocations(Code* code) { |
| it.rinfo()->WipeOut(); |
| } |
| } |
| + // We need to wipe out the header fields *after* wiping out the |
| + // relocations, because some of these fields are needed for the latter. |
| + code->WipeOutHeader(); |
| + return code->address(); |
| } |
| @@ -2099,17 +2105,7 @@ int Serializer::ObjectSerializer::OutputRawData( |
| sink_->PutInt(bytes_to_output, "length"); |
| } |
| - // To make snapshots reproducible, we need to wipe out all pointers in code. |
| - if (code_object_) { |
| - Code* code = CloneCodeObject(object_); |
| - // Code age headers are not serializable. |
| - code->MakeYoung(serializer_->isolate()); |
| - WipeOutRelocations(code); |
| - // We need to wipe out the header fields *after* wiping out the |
| - // relocations, because some of these fields are needed for the latter. |
| - code->WipeOutHeader(); |
| - object_start = code->address(); |
| - } |
| + if (code_object_) object_start = PrepareCode(); |
| const char* description = code_object_ ? "Code" : "Byte"; |
| #ifdef MEMORY_SANITIZER |
| @@ -2117,7 +2113,6 @@ int Serializer::ObjectSerializer::OutputRawData( |
| MSAN_MEMORY_IS_INITIALIZED(object_start + base, bytes_to_output); |
| #endif // MEMORY_SANITIZER |
| sink_->PutRaw(object_start + base, bytes_to_output, description); |
| - if (code_object_) delete[] object_start; |
| } |
| if (to_skip != 0 && return_skip == kIgnoringReturn) { |
| sink_->Put(kSkip, "Skip"); |
| @@ -2416,8 +2411,11 @@ MaybeHandle<SharedFunctionInfo> CodeSerializer::Deserialize( |
| deserializer.SetAttachedObjects(attached_objects); |
| // Deserialize. |
| + MaybeHandle<SharedFunctionInfo> maybe = deserializer.DeserializeCode(isolate); |
| + attached_objects.Dispose(); |
| + |
| Handle<SharedFunctionInfo> result; |
| - if (!deserializer.DeserializeCode(isolate).ToHandle(&result)) { |
| + if (!maybe.ToHandle(&result)) { |
| // Deserializing may fail if the reservations cannot be fulfilled. |
| if (FLAG_profile_deserialization) PrintF("[Deserializing failed]\n"); |
| return MaybeHandle<SharedFunctionInfo>(); |