// Copyright 2017 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "src/snapshot/object-deserializer.h" #include "src/codegen/assembler-inl.h" #include "src/execution/isolate.h" #include "src/heap/heap-inl.h" #include "src/heap/local-factory-inl.h" #include "src/objects/allocation-site-inl.h" #include "src/objects/js-array-buffer-inl.h" #include "src/objects/objects.h" #include "src/objects/slots.h" #include "src/snapshot/code-serializer.h" namespace v8 { namespace internal { ObjectDeserializer::ObjectDeserializer(Isolate* isolate, const SerializedCodeData* data) : Deserializer(isolate, data->Payload(), data->GetMagicNumber(), true, false) {} MaybeHandle ObjectDeserializer::DeserializeSharedFunctionInfo( Isolate* isolate, const SerializedCodeData* data, Handle source) { ObjectDeserializer d(isolate, data); d.AddAttachedObject(source); Handle result; return d.Deserialize().ToHandle(&result) ? Handle::cast(result) : MaybeHandle(); } MaybeHandle ObjectDeserializer::Deserialize() { DCHECK(deserializing_user_code()); HandleScope scope(isolate()); Handle result; { result = ReadObject(); DeserializeDeferredObjects(); CHECK(new_code_objects().empty()); LinkAllocationSites(); CHECK(new_maps().empty()); WeakenDescriptorArrays(); } Rehash(); CommitPostProcessedObjects(); return scope.CloseAndEscape(result); } void ObjectDeserializer::CommitPostProcessedObjects() { for (Handle buffer : new_off_heap_array_buffers()) { uint32_t store_index = buffer->GetBackingStoreRefForDeserialization(); auto bs = backing_store(store_index); SharedFlag shared = bs && bs->is_shared() ? SharedFlag::kShared : SharedFlag::kNotShared; // TODO(v8:11111): Support RAB / GSAB. CHECK(!bs || !bs->is_resizable()); buffer->Setup(shared, ResizableFlag::kNotResizable, bs); } for (Handle