5 #include "src/snapshot/partial-deserializer.h" 7 #include "src/api-inl.h" 8 #include "src/objects/slots.h" 9 #include "src/snapshot/snapshot.h" 14 MaybeHandle<Context> PartialDeserializer::DeserializeContext(
15 Isolate* isolate,
const SnapshotData* data,
bool can_rehash,
16 Handle<JSGlobalProxy> global_proxy,
17 v8::DeserializeEmbedderFieldsCallback embedder_fields_deserializer) {
18 PartialDeserializer d(data);
19 d.SetRehashability(can_rehash);
21 MaybeHandle<Object> maybe_result =
22 d.Deserialize(isolate, global_proxy, embedder_fields_deserializer);
24 Handle<Object> result;
25 return maybe_result.ToHandle(&result) ? Handle<Context>::cast(result)
26 : MaybeHandle<Context>();
29 MaybeHandle<Object> PartialDeserializer::Deserialize(
30 Isolate* isolate, Handle<JSGlobalProxy> global_proxy,
31 v8::DeserializeEmbedderFieldsCallback embedder_fields_deserializer) {
33 if (!allocator()->ReserveSpace()) {
34 V8::FatalProcessOutOfMemory(isolate,
"PartialDeserializer");
37 AddAttachedObject(global_proxy);
39 DisallowHeapAllocation no_gc;
42 CodeSpace* code_space = isolate->heap()->code_space();
43 Address start_address = code_space->top();
45 VisitRootPointer(Root::kPartialSnapshotCache,
nullptr, ObjectSlot(&root));
46 DeserializeDeferredObjects();
47 DeserializeEmbedderFields(embedder_fields_deserializer);
49 allocator()->RegisterDeserializedObjectsForBlackAllocation();
54 CHECK_EQ(start_address, code_space->top());
56 if (FLAG_rehash_snapshot && can_rehash()) Rehash();
59 return Handle<Object>(root, isolate);
62 void PartialDeserializer::DeserializeEmbedderFields(
63 v8::DeserializeEmbedderFieldsCallback embedder_fields_deserializer) {
64 if (!source()->HasMore() || source()->Get() != kEmbedderFieldsData)
return;
65 DisallowHeapAllocation no_gc;
66 DisallowJavascriptExecution no_js(isolate());
67 DisallowCompilation no_compile(isolate());
68 DCHECK_NOT_NULL(embedder_fields_deserializer.callback);
69 for (
int code = source()->Get(); code != kSynchronize;
70 code = source()->Get()) {
71 HandleScope scope(isolate());
72 int space = code & kSpaceMask;
73 DCHECK_LE(space, kNumberOfSpaces);
74 DCHECK_EQ(code - space, kNewObject);
75 Handle<JSObject> obj(JSObject::cast(GetBackReferencedObject(space)),
77 int index = source()->GetInt();
78 int size = source()->GetInt();
80 byte* data =
new byte[size];
81 source()->CopyRaw(data, size);
82 embedder_fields_deserializer.callback(v8::Utils::ToLocal(obj), index,
83 {
reinterpret_cast<char*
>(data), size},
84 embedder_fields_deserializer.data);