| // 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::DeserializeIntoIsolate() { |
| HandleScope scope(isolate()); |
| |
| 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()); |
| // Startup object cache is not yet populated. |
| DCHECK(isolate()->startup_object_cache()->empty()); |
| // Builtins are not yet created. |
| DCHECK(!isolate()->builtins()->is_initialized()); |
| |
| { |
| ReadOnlyRoots roots(isolate()); |
| |
| roots.Iterate(this); |
| ro_heap->read_only_space()->RepairFreeSpacesAfterDeserialization(); |
| |
| // 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(); |
| CheckNoArrayBufferBackingStores(); |
| } |
| |
| if (FLAG_rehash_snapshot && can_rehash()) { |
| isolate()->heap()->InitializeHashSeed(); |
| Rehash(); |
| } |
| } |
| |
| } // namespace internal |
| } // namespace v8 |