| // Copyright 2018 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/read-only-deserializer.h" |
| |
| #include "src/api/api.h" |
| #include "src/execution/v8threads.h" |
| #include "src/heap/heap-inl.h" // crbug.com/v8/8499 |
| #include "src/heap/read-only-heap.h" |
| #include "src/objects/slots.h" |
| #include "src/snapshot/snapshot.h" |
| |
| namespace v8 { |
| namespace internal { |
| |
| void ReadOnlyDeserializer::DeserializeInto(Isolate* isolate) { |
| Initialize(isolate); |
| |
| if (!allocator()->ReserveSpace()) { |
| V8::FatalProcessOutOfMemory(isolate, "ReadOnlyDeserializer"); |
| } |
| |
| ReadOnlyHeap* ro_heap = isolate->read_only_heap(); |
| |
| // No active threads. |
| DCHECK_NULL(isolate->thread_manager()->FirstThreadStateInUse()); |
| // No active handles. |
| DCHECK(isolate->handle_scope_implementer()->blocks()->empty()); |
| // Read-only object cache is not yet populated. |
| DCHECK(!ro_heap->read_only_object_cache_is_initialized()); |
| // Partial snapshot cache is not yet populated. |
| DCHECK(isolate->partial_snapshot_cache()->empty()); |
| // Builtins are not yet created. |
| DCHECK(!isolate->builtins()->is_initialized()); |
| |
| { |
| DisallowHeapAllocation no_gc; |
| ReadOnlyRoots roots(isolate); |
| |
| roots.Iterate(this); |
| ro_heap->read_only_space()->RepairFreeListsAfterDeserialization(); |
| |
| // Deserialize the Read-only Object Cache. |
| for (size_t i = 0;; ++i) { |
| Object* object = ro_heap->ExtendReadOnlyObjectCache(); |
| // During deserialization, the visitor populates the read-only object |
| // cache and eventually terminates the cache with undefined. |
| VisitRootPointer(Root::kReadOnlyObjectCache, nullptr, |
| FullObjectSlot(object)); |
| if (object->IsUndefined(roots)) break; |
| } |
| DeserializeDeferredObjects(); |
| } |
| |
| if (FLAG_rehash_snapshot && can_rehash()) { |
| isolate_->heap()->InitializeHashSeed(); |
| Rehash(); |
| } |
| } |
| |
| } // namespace internal |
| } // namespace v8 |