diff options
Diffstat (limited to 'deps/v8/src/snapshot/deserializer.cc')
-rw-r--r-- | deps/v8/src/snapshot/deserializer.cc | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/deps/v8/src/snapshot/deserializer.cc b/deps/v8/src/snapshot/deserializer.cc index aabd806b7a..87e430baf5 100644 --- a/deps/v8/src/snapshot/deserializer.cc +++ b/deps/v8/src/snapshot/deserializer.cc @@ -93,6 +93,7 @@ void Deserializer::Deserialize(Isolate* isolate) { isolate_->heap()->IterateWeakRoots(this, VISIT_ALL); DeserializeDeferredObjects(); FlushICacheForNewIsolate(); + RestoreExternalReferenceRedirectors(&accessor_infos_); } isolate_->heap()->set_native_contexts_list( @@ -111,7 +112,8 @@ void Deserializer::Deserialize(Isolate* isolate) { } MaybeHandle<Object> Deserializer::DeserializePartial( - Isolate* isolate, Handle<JSGlobalProxy> global_proxy) { + Isolate* isolate, Handle<JSGlobalProxy> global_proxy, + v8::DeserializeInternalFieldsCallback internal_fields_deserializer) { Initialize(isolate); if (!ReserveSpace()) { V8::FatalProcessOutOfMemory("deserialize context"); @@ -128,7 +130,7 @@ MaybeHandle<Object> Deserializer::DeserializePartial( Object* root; VisitPointer(&root); DeserializeDeferredObjects(); - DeserializeInternalFields(); + DeserializeInternalFields(internal_fields_deserializer); isolate->heap()->RegisterReservationsForBlackAllocation(reservations_); @@ -213,14 +215,13 @@ void Deserializer::DeserializeDeferredObjects() { } } -void Deserializer::DeserializeInternalFields() { +void Deserializer::DeserializeInternalFields( + v8::DeserializeInternalFieldsCallback internal_fields_deserializer) { if (!source_.HasMore() || source_.Get() != kInternalFieldsData) return; DisallowHeapAllocation no_gc; DisallowJavascriptExecution no_js(isolate_); DisallowCompilation no_compile(isolate_); - v8::DeserializeInternalFieldsCallback callback = - isolate_->deserialize_internal_fields_callback(); - DCHECK_NOT_NULL(callback); + DCHECK_NOT_NULL(internal_fields_deserializer.callback); for (int code = source_.Get(); code != kSynchronize; code = source_.Get()) { HandleScope scope(isolate_); int space = code & kSpaceMask; @@ -232,8 +233,9 @@ void Deserializer::DeserializeInternalFields() { int size = source_.GetInt(); byte* data = new byte[size]; source_.CopyRaw(data, size); - callback(v8::Utils::ToLocal(obj), index, - {reinterpret_cast<char*>(data), size}); + internal_fields_deserializer.callback(v8::Utils::ToLocal(obj), index, + {reinterpret_cast<char*>(data), size}, + internal_fields_deserializer.data); delete[] data; } } @@ -316,6 +318,10 @@ HeapObject* Deserializer::PostProcessNewObject(HeapObject* obj, int space) { if (deserializing_user_code() || space == LO_SPACE) { new_code_objects_.Add(Code::cast(obj)); } + } else if (obj->IsAccessorInfo()) { + if (isolate_->external_reference_redirector()) { + accessor_infos_.Add(AccessorInfo::cast(obj)); + } } // Check alignment. DCHECK_EQ(0, Heap::GetFillToAlign(obj->address(), obj->RequiredAlignment())); |