• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2018 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "src/snapshot/read-only-deserializer.h"
6 
7 #include "src/api/api.h"
8 #include "src/execution/v8threads.h"
9 #include "src/heap/heap-inl.h"  // crbug.com/v8/8499
10 #include "src/heap/read-only-heap.h"
11 #include "src/objects/slots.h"
12 #include "src/snapshot/snapshot.h"
13 
14 namespace v8 {
15 namespace internal {
16 
DeserializeIntoIsolate()17 void ReadOnlyDeserializer::DeserializeIntoIsolate() {
18   HandleScope scope(isolate());
19 
20   ReadOnlyHeap* ro_heap = isolate()->read_only_heap();
21 
22   // No active threads.
23   DCHECK_NULL(isolate()->thread_manager()->FirstThreadStateInUse());
24   // No active handles.
25   DCHECK(isolate()->handle_scope_implementer()->blocks()->empty());
26   // Read-only object cache is not yet populated.
27   DCHECK(!ro_heap->read_only_object_cache_is_initialized());
28   // Startup object cache is not yet populated.
29   DCHECK(isolate()->startup_object_cache()->empty());
30   // Builtins are not yet created.
31   DCHECK(!isolate()->builtins()->is_initialized());
32 
33   {
34     ReadOnlyRoots roots(isolate());
35 
36     roots.Iterate(this);
37     ro_heap->read_only_space()->RepairFreeSpacesAfterDeserialization();
38 
39     // Deserialize the Read-only Object Cache.
40     for (;;) {
41       Object* object = ro_heap->ExtendReadOnlyObjectCache();
42       // During deserialization, the visitor populates the read-only object
43       // cache and eventually terminates the cache with undefined.
44       VisitRootPointer(Root::kReadOnlyObjectCache, nullptr,
45                        FullObjectSlot(object));
46       if (object->IsUndefined(roots)) break;
47     }
48     DeserializeDeferredObjects();
49     CheckNoArrayBufferBackingStores();
50   }
51 
52   if (should_rehash()) {
53     isolate()->heap()->InitializeHashSeed();
54     Rehash();
55   }
56 }
57 
58 }  // namespace internal
59 }  // namespace v8
60