44#ifdef V8_COMPRESS_POINTERS
45#define PRIxTAGGED PRIx32
47#define PRIxTAGGED PRIxPTR
77#ifdef V8_STATIC_ROOTS_BOOL
94 return Write(*value, ref_type, slot_offset, mode);
101 DCHECK(IsExposedTrustedObject(value));
104 InstanceType instance_type = value->map()->instance_type();
157 return Write(*value, ref_type, slot_offset, mode);
173template <
typename IsolateT>
216template <
typename IsolateT>
217template <
typename SlotAccessor>
220 ReferenceDescriptor descr,
222 if (descr.is_indirect_pointer) {
223 return slot_accessor.WriteIndirectPointerTo(heap_object, mode);
225 return slot_accessor.Write(heap_object, descr.type, 0, mode);
229template <
typename IsolateT>
230template <
typename SlotAccessor>
234 if (descr.is_indirect_pointer) {
235 return slot_accessor.WriteIndirectPointerTo(*heap_object, mode);
236 }
else if (descr.is_protected_pointer) {
237 DCHECK(IsTrustedObject(*heap_object));
238 return slot_accessor.WriteProtectedPointerTo(
241 return slot_accessor.Write(heap_object, descr.type, 0, mode);
245template <
typename IsolateT>
250 DCHECK(!next_reference_is_weak_ && !next_reference_is_indirect_pointer_ &&
251 !next_reference_is_protected_pointer);
253 #ifdef V8_ENABLE_SANDBOX
254 ExternalPointerTable::ManagedResource* managed_resource =
nullptr;
255 ExternalPointerTable* owning_table =
nullptr;
268 reinterpret_cast<ExternalPointerTable::ManagedResource*
>(
value);
269 owning_table = managed_resource->owning_table_;
270 original_handle = managed_resource->ept_entry_;
271 managed_resource->owning_table_ =
nullptr;
276 dest.init(main_thread_isolate(), host, value, tag);
278#ifdef V8_ENABLE_SANDBOX
279 if (managed_resource) {
280 managed_resource->owning_table_ = owning_table;
281 managed_resource->ept_entry_ = original_handle;
292int GetNumApiReferences(Isolate* isolate) {
293 int num_api_references = 0;
297 if (isolate->isolate_data()->external_reference_table()->is_initialized()) {
299 if (isolate->api_external_references() !=
nullptr) {
300 while (isolate->api_external_references()[num_api_references] != 0) {
301 num_api_references++;
305 return num_api_references;
307int GetNumApiReferences(LocalIsolate* isolate) {
return 0; }
311template <
typename IsolateT>
314 uint32_t magic_number,
315 bool deserializing_user_code,
318 attached_objects_(isolate),
320 magic_number_(magic_number),
322 new_allocation_sites_(isolate),
323 new_code_objects_(isolate),
324 accessor_infos_(isolate),
325 function_template_infos_(isolate),
326 new_scripts_(isolate),
327 new_descriptor_arrays_(isolate->
heap()),
328 deserializing_user_code_(deserializing_user_code),
329 should_rehash_((
v8_flags.rehash_snapshot && can_rehash) ||
330 deserializing_user_code),
331 to_rehash_(isolate) {
333 isolate->RegisterDeserializerStarted();
345 num_api_references_ = GetNumApiReferences(isolate);
350template <
typename IsolateT>
354 item->RehashBasedOnMap(
isolate());
358template <
typename IsolateT>
362 if (
source_.position() == 0)
return;
366 DCHECK_EQ(num_unresolved_forward_refs_, 0);
367 DCHECK(unresolved_forward_refs_.empty());
374template <
typename IsolateT>
376 const char* description,
382template <
typename IsolateT>
384 static const uint8_t expected = kSynchronize;
386 if (
v8_flags.trace_deserialization) {
389#define CASE(ID, NAME) \
390 case VisitorSynchronization::ID: \
396 name =
"(!unknown!)";
399 PrintF(
"Synchronize %d %s\n", tag, name);
403template <
typename IsolateT>
405 if (
v8_flags.trace_deserialization) {
406 PrintF(
"-- Deferred objects\n");
408 for (
int code =
source_.Get(); code != kSynchronize; code =
source_.Get()) {
414template <
typename IsolateT>
425template <
typename IsolateT>
430template <
typename IsolateT>
438template <
typename IsolateT>
439uint32_t ComputeRawHashField(IsolateT* isolate,
Tagged<String> string) {
442 return string->raw_hash_field();
449 :
StringTableKey(ComputeRawHashField(isolate, *string), string->length()),
452 deserializing_user_code_ = deserializing_user_code;
454 DCHECK(IsInternalizedString(*
string));
460 :
StringTableKey(ComputeRawHashField(isolate, *string), string->length()),
463 deserializing_user_code_ = deserializing_user_code;
465 DCHECK(IsInternalizedString(*
string));
468template <
typename IsolateT>
486 FATAL(
"No external references provided via API");
492 uint32_t index =
string->GetResourceRefForDeserialization();
494 static_cast<Address>(isolate->api_external_references()[index]);
495 string->InitExternalPointerFields(isolate);
496 string->set_address_as_resource(isolate, address);
497 isolate->heap()->UpdateExternalString(
string, 0,
498 string->ExternalPayloadSize());
499 isolate->heap()->RegisterExternalString(
string);
509 DCHECK_EQ(map->instance_type(), instance_type);
511 if (InstanceTypeChecker::IsJSDataView(instance_type) ||
512 InstanceTypeChecker::IsJSRabGsabDataView(instance_type)) {
515 if (buffer->was_detached()) {
519 data_view->set_data_pointer(main_thread_isolate(),
522 void* backing_store = buffer->backing_store();
523 data_view->set_data_pointer(
524 main_thread_isolate(),
525 reinterpret_cast<uint8_t*
>(backing_store) + data_view->byte_offset());
527 }
else if (InstanceTypeChecker::IsJSTypedArray(instance_type)) {
532 if (typed_array->is_on_heap()) {
533 typed_array->AddExternalPointerCompensationForDeserialization(
534 main_thread_isolate());
537 uint32_t store_index =
538 typed_array->GetExternalBackingStoreRefForDeserialization();
539 auto backing_store = backing_stores_[store_index];
540 void*
start = backing_store ? backing_store->buffer_start() :
nullptr;
542 typed_array->SetOffHeapDataPtr(main_thread_isolate(),
start,
543 typed_array->byte_offset());
545 }
else if (InstanceTypeChecker::IsJSArrayBuffer(instance_type)) {
547 uint32_t store_index = buffer->GetBackingStoreRefForDeserialization();
548 buffer->init_extension();
549 if (store_index == kEmptyBackingStoreRefSentinel) {
550 buffer->set_backing_store(main_thread_isolate(),
553 auto bs = backing_store(store_index);
557 buffer->is_resizable_by_js() == bs->is_resizable_by_js());
561 buffer->Setup(shared, resizable, bs, main_thread_isolate());
573template <
typename IsolateT>
583 if (should_rehash()) {
584 if (InstanceTypeChecker::IsString(instance_type)) {
591 PushObjectToRehash(obj);
593 }
else if (raw_obj->NeedsRehashing(instance_type)) {
594 PushObjectToRehash(obj);
597 if (deserializing_user_code()) {
620 }
else if (InstanceTypeChecker::IsScript(instance_type)) {
622 }
else if (InstanceTypeChecker::IsAllocationSite(instance_type)) {
631 DCHECK(CanBeDeferred(*obj, SlotType::kAnySlot) ||
632 InstanceTypeChecker::IsByteArray(instance_type));
637 if (InstanceTypeChecker::IsInstructionStream(instance_type)) {
641 if (deserializing_user_code()) {
644 }
else if (InstanceTypeChecker::IsCode(instance_type)) {
646 if (!code->has_instruction_stream()) {
647 code->SetInstructionStartForOffHeapBuiltin(
649 .InstructionStartOf(code->builtin_id()));
651 code->UpdateInstructionStart(main_thread_isolate(),
652 code->instruction_stream());
654 }
else if (InstanceTypeChecker::IsSharedFunctionInfo(instance_type)) {
657 sfi->set_unique_id(
isolate()->GetAndIncNextUniqueSfiId());
658 }
else if (InstanceTypeChecker::IsMap(instance_type)) {
664 }
else if (InstanceTypeChecker::IsAccessorInfo(instance_type)) {
668 }
else if (InstanceTypeChecker::IsFunctionTemplateInfo(instance_type)) {
674 main_thread_isolate());
675 }
else if (InstanceTypeChecker::IsJSReceiver(instance_type)) {
679 instance_type, space);
680 }
else if (InstanceTypeChecker::IsDescriptorArray(instance_type)) {
681 DCHECK(InstanceTypeChecker::IsStrongDescriptorArray(instance_type));
683 new_descriptor_arrays_.Push(*descriptors);
684 }
else if (InstanceTypeChecker::IsNativeContext(instance_type)) {
687 }
else if (InstanceTypeChecker::IsScript(instance_type)) {
692template <
typename IsolateT>
695 DCHECK(!(next_reference_is_weak_ && next_reference_is_indirect_pointer_));
697 desc.
type = next_reference_is_weak_ ? HeapObjectReferenceType::WEAK
698 : HeapObjectReferenceType::STRONG;
699 next_reference_is_weak_ =
false;
700 desc.is_indirect_pointer = next_reference_is_indirect_pointer_;
701 next_reference_is_indirect_pointer_ =
false;
702 desc.is_protected_pointer = next_reference_is_protected_pointer;
703 next_reference_is_protected_pointer =
false;
707template <
typename IsolateT>
709 return GetBackReferencedObject(
source_.GetUint30());
712template <
typename IsolateT>
721 hot_objects_.Add(obj);
726template <
typename IsolateT>
750template <
typename IsolateT>
752 const int size_in_tagged =
source_.GetUint30();
753 const int size_in_bytes = size_in_tagged *
kTaggedSize;
799 raw_obj->set_map_after_allocation(
isolate_, *map);
802 DCHECK(raw_obj->CheckRequiredAlignment(isolate()));
806 if (IsSharedFunctionInfo(raw_obj,
isolate())) {
808 }
else if (IsEphemeronHashTable(raw_obj)) {
815 (size_in_bytes - table->kElementsStartOffset) /
kTaggedSize);
821 if (IsJSObject(raw_obj, cage_base) &&
824 for (
int i = 0;
i < js_obj->GetEmbedderFieldCount(); ++
i) {
830 }
else if (IsEmbedderDataArray(raw_obj, cage_base)) {
836 CHECK(slot.ToAlignedPointer(main_thread_isolate(), &pointer));
843 back_refs_.push_back(obj);
844 if (
v8_flags.trace_deserialization) {
845 PrintF(
" %*s(set obj backref %u)\n", depth_,
"",
846 static_cast<int>(back_refs_.size() - 1));
849 ReadData(obj, 1, size_in_tagged);
850 PostProcessNewObject(map, obj, space);
853 if (IsInstructionStream(*obj, cage_base)) {
859 if (IsTrustedObject(*obj)) {
869template <
typename IsolateT>
871 const int size_in_bytes = Map::kSize;
872 const int size_in_tagged = size_in_bytes /
kTaggedSize;
875 Allocate(SpaceToAllocation(space), size_in_bytes,
kTaggedAligned);
879 DCHECK(raw_obj->CheckRequiredAlignment(isolate()));
882 back_refs_.push_back(obj);
883 if (
v8_flags.trace_deserialization) {
884 PrintF(
" %*s(set obj backref %u)\n", depth_,
"",
885 static_cast<int>(back_refs_.size() - 1));
891 ReadData(obj, 1, size_in_tagged);
892 PostProcessNewObject(
Cast<Map>(obj), obj, space);
897template <
typename IsolateT>
898template <
typename SlotAccessor>
905 if (
v8_flags.trace_deserialization) {
913 for (
int i = 0;
i < repeat_count;
i++) {
914 slot_accessor.Write(heap_object, HeapObjectReferenceType::STRONG,
i,
924template <
int byte_code_count,
int expected>
925constexpr uint8_t VerifyBytecodeCount(uint8_t bytecode) {
926 static_assert(byte_code_count == expected);
934#define CASE_RANGE(byte_code, num_bytecodes) \
935 CASE_R##num_bytecodes( \
936 (VerifyBytecodeCount<byte_code##Count, num_bytecodes>(byte_code)))
937#define CASE_R1(byte_code) byte_code
938#define CASE_R2(byte_code) CASE_R1(byte_code) : case CASE_R1(byte_code + 1)
939#define CASE_R3(byte_code) CASE_R2(byte_code) : case CASE_R1(byte_code + 2)
940#define CASE_R4(byte_code) CASE_R2(byte_code) : case CASE_R2(byte_code + 2)
941#define CASE_R8(byte_code) CASE_R4(byte_code) : case CASE_R4(byte_code + 4)
942#define CASE_R16(byte_code) CASE_R8(byte_code) : case CASE_R8(byte_code + 8)
943#define CASE_R32(byte_code) CASE_R16(byte_code) : case CASE_R16(byte_code + 16)
947#define CASE_RANGE_ALL_SPACES(bytecode) \
948 SpaceEncoder<bytecode>::Encode(SnapshotSpace::kOld): \
949 case SpaceEncoder<bytecode>::Encode(SnapshotSpace::kCode): \
950 case SpaceEncoder<bytecode>::Encode(SnapshotSpace::kReadOnlyHeap): \
951 case SpaceEncoder<bytecode>::Encode(SnapshotSpace::kTrusted)
954template <
typename IsolateT>
956 int start_slot_index,
957 int end_slot_index) {
958 int current = start_slot_index;
959 while (current < end_slot_index) {
961 current += ReadSingleBytecodeData(
967template <
typename IsolateT>
971 while (current <
end) {
978template <
typename IsolateT>
979template <
typename SlotAccessor>
981 SlotAccessor slot_accessor) {
982 if (
v8_flags.trace_deserialization) {
987 return ReadNewObject(data, slot_accessor);
989 return ReadBackref(data, slot_accessor);
990 case kReadOnlyHeapRef:
991 return ReadReadOnlyHeapRef(data, slot_accessor);
993 return ReadRootArray(data, slot_accessor);
994 case kStartupObjectCache:
995 return ReadStartupObjectCache(data, slot_accessor);
996 case kSharedHeapObjectCache:
997 return ReadSharedHeapObjectCache(data, slot_accessor);
998 case kNewContextlessMetaMap:
999 case kNewContextfulMetaMap:
1000 return ReadNewMetaMap(data, slot_accessor);
1001 case kSandboxedExternalReference:
1002 case kExternalReference:
1003 return ReadExternalReference(data, slot_accessor);
1004 case kSandboxedRawExternalReference:
1005 return ReadRawExternalReference(data, slot_accessor);
1006 case kAttachedReference:
1007 return ReadAttachedReference(data, slot_accessor);
1010 case kRegisterPendingForwardRef:
1011 return ReadRegisterPendingForwardRef(data, slot_accessor);
1012 case kResolvePendingForwardRef:
1013 return ReadResolvePendingForwardRef(data, slot_accessor);
1018 case kVariableRawData:
1019 return ReadVariableRawData(data, slot_accessor);
1020 case kVariableRepeatRoot:
1021 return ReadVariableRepeatRoot(data, slot_accessor);
1022 case kOffHeapBackingStore:
1023 case kOffHeapResizableBackingStore:
1024 return ReadOffHeapBackingStore(data, slot_accessor);
1025 case kSandboxedApiReference:
1027 return ReadApiReference(data, slot_accessor);
1028 case kClearedWeakReference:
1029 return ReadClearedWeakReference(data, slot_accessor);
1031 return ReadWeakPrefix(data, slot_accessor);
1032 case kIndirectPointerPrefix:
1033 return ReadIndirectPointerPrefix(data, slot_accessor);
1034 case kInitializeSelfIndirectPointer:
1035 return ReadInitializeSelfIndirectPointer(data, slot_accessor);
1036 case kAllocateJSDispatchEntry:
1037 return ReadAllocateJSDispatchEntry(data, slot_accessor);
1038 case kJSDispatchEntry:
1039 return ReadJSDispatchEntry(data, slot_accessor);
1040 case kProtectedPointerPrefix:
1041 return ReadProtectedPointerPrefix(data, slot_accessor);
1043 return ReadRootArrayConstants(data, slot_accessor);
1045 return ReadHotObject(data, slot_accessor);
1047 return ReadFixedRawData(data, slot_accessor);
1049 return ReadFixedRepeatRoot(data, slot_accessor);
1052#define UNUSED_CASE(byte_code) \
1070 return "ReadOnlyHeap";
1078 return "(!unknown space!)";
1084template <
typename IsolateT>
1085template <
typename SlotAccessor>
1087 SlotAccessor slot_accessor) {
1089 if (
v8_flags.trace_deserialization) {
1090 PrintF(
"%*sNewObject [%s]\n", depth_,
"", SnapshotSpaceName(space));
1097 if (
v8_flags.trace_deserialization) {
1100 return WriteHeapPointer(slot_accessor, heap_object, descr);
1105template <
typename IsolateT>
1106template <
typename SlotAccessor>
1108 SlotAccessor slot_accessor) {
1109 uint32_t index =
source_.GetUint30();
1111 if (
v8_flags.trace_deserialization) {
1112 PrintF(
"%*sBackref [%u]\n", depth_,
"", index);
1118 return WriteHeapPointer(slot_accessor, heap_object,
1119 GetAndResetNextReferenceDescriptor());
1123template <
typename IsolateT>
1124template <
typename SlotAccessor>
1126 SlotAccessor slot_accessor) {
1127 uint32_t chunk_index =
source_.GetUint30();
1128 uint32_t chunk_offset =
source_.GetUint30();
1132 Address address = page->OffsetToAddress(chunk_offset);
1135 if (
v8_flags.trace_deserialization) {
1136 PrintF(
"%*sReadOnlyHeapRef [%u, %u] : ", depth_,
"", chunk_index,
1142 return WriteHeapPointer(slot_accessor, heap_object,
1143 GetAndResetNextReferenceDescriptor(),
1149template <
typename IsolateT>
1150template <
typename SlotAccessor>
1152 SlotAccessor slot_accessor) {
1158 if (
v8_flags.trace_deserialization) {
1159 PrintF(
"%*sRootArray [%u] : %s\n", depth_,
"",
id,
1162 hot_objects_.Add(heap_object);
1163 return WriteHeapPointer(
1164 slot_accessor, heap_object, GetAndResetNextReferenceDescriptor(),
1171template <
typename IsolateT>
1172template <
typename SlotAccessor>
1174 SlotAccessor slot_accessor) {
1175 int cache_index =
source_.GetUint30();
1179 main_thread_isolate()->startup_object_cache()->at(cache_index));
1180 if (
v8_flags.trace_deserialization) {
1181 PrintF(
"%*sStartupObjectCache [%u] : ", depth_,
"", cache_index);
1185 return WriteHeapPointer(slot_accessor, heap_object,
1186 GetAndResetNextReferenceDescriptor());
1191template <
typename IsolateT>
1192template <
typename SlotAccessor>
1194 uint8_t data, SlotAccessor slot_accessor) {
1195 int cache_index =
source_.GetUint30();
1199 main_thread_isolate()->shared_heap_object_cache()->at(cache_index));
1201 return WriteHeapPointer(slot_accessor, heap_object,
1202 GetAndResetNextReferenceDescriptor());
1207template <
typename IsolateT>
1208template <
typename SlotAccessor>
1210 SlotAccessor slot_accessor) {
1215 if (
v8_flags.trace_deserialization) {
1216 PrintF(
"%*sNewMetaMap [%s]\n", depth_,
"", SnapshotSpaceName(space));
1218 return slot_accessor.Write(heap_object, HeapObjectReferenceType::STRONG, 0,
1224template <
typename IsolateT>
1225template <
typename SlotAccessor>
1227 SlotAccessor slot_accessor) {
1229 Address address = ReadExternalReferenceCase();
1231 if (data == kSandboxedExternalReference) {
1232 tag = ReadExternalPointerTag();
1234 if (
v8_flags.trace_deserialization) {
1235 PrintF(
"%*sExternalReference [%" PRIxPTR
", %i]\n", depth_,
"", address,
1238 return WriteExternalPointer(*slot_accessor.object(),
1239 slot_accessor.external_pointer_slot(tag), address,
1243template <
typename IsolateT>
1244template <
typename SlotAccessor>
1246 uint8_t data, SlotAccessor slot_accessor) {
1251 if (data == kSandboxedRawExternalReference) {
1252 tag = ReadExternalPointerTag();
1254 if (
v8_flags.trace_deserialization) {
1255 PrintF(
"%*sRawExternalReference [%" PRIxPTR
", %i]\n", depth_,
"", address,
1258 return WriteExternalPointer(*slot_accessor.object(),
1259 slot_accessor.external_pointer_slot(tag), address,
1265template <
typename IsolateT>
1266template <
typename SlotAccessor>
1268 SlotAccessor slot_accessor) {
1269 int index =
source_.GetUint30();
1271 if (
v8_flags.trace_deserialization) {
1272 PrintF(
"%*sAttachedReference [%u] : ", depth_,
"", index);
1276 return WriteHeapPointer(slot_accessor, heap_object,
1277 GetAndResetNextReferenceDescriptor());
1280template <
typename IsolateT>
1281template <
typename SlotAccessor>
1283 uint8_t data, SlotAccessor slot_accessor) {
1285 unresolved_forward_refs_.emplace_back(slot_accessor.object(),
1286 slot_accessor.offset(), descr);
1287 num_unresolved_forward_refs_++;
1291template <
typename IsolateT>
1292template <
typename SlotAccessor>
1294 uint8_t data, SlotAccessor slot_accessor) {
1301 int index =
source_.GetUint30();
1302 auto& forward_ref = unresolved_forward_refs_[
index];
1304 forward_ref.offset);
1305 WriteHeapPointer(slot, obj, forward_ref.descr);
1306 num_unresolved_forward_refs_--;
1307 if (num_unresolved_forward_refs_ == 0) {
1310 unresolved_forward_refs_.clear();
1319template <
typename IsolateT>
1320template <
typename SlotAccessor>
1322 SlotAccessor slot_accessor) {
1326 int size_in_tagged =
source_.GetUint30();
1327 if (
v8_flags.trace_deserialization) {
1328 PrintF(
"%*sVariableRawData [%u] :", depth_,
"", size_in_tagged);
1329 for (
int i = 0;
i < size_in_tagged; ++
i) {
1337 source_.CopySlots(slot_accessor.slot().location(), size_in_tagged);
1338 return size_in_tagged;
1341template <
typename IsolateT>
1342template <
typename SlotAccessor>
1344 SlotAccessor slot_accessor) {
1345 int repeats = VariableRepeatRootCount::Decode(
source_.GetUint30());
1346 if (
v8_flags.trace_deserialization) {
1347 PrintF(
"%*sVariableRepeat [%u] : ", depth_,
"", repeats);
1349 int ret = ReadRepeatedRoot(slot_accessor, repeats);
1350 if (
v8_flags.trace_deserialization) {
1356template <
typename IsolateT>
1357template <
typename SlotAccessor>
1359 uint8_t data, SlotAccessor slot_accessor) {
1360 int byte_length =
source_.GetUint32();
1361 if (
v8_flags.trace_deserialization) {
1362 PrintF(
"%*sOffHeapBackingStore [%d]\n", depth_,
"", byte_length);
1365 std::unique_ptr<BackingStore> backing_store;
1366 if (data == kOffHeapBackingStore) {
1371 int max_byte_length =
source_.GetUint32();
1372 size_t page_size, initial_pages, max_pages;
1375 nullptr, byte_length, max_byte_length,
kDontThrow, &page_size,
1376 &initial_pages, &max_pages);
1380 main_thread_isolate(), byte_length, max_byte_length, page_size,
1385 source_.CopyRaw(backing_store->buffer_start(), byte_length);
1386 backing_stores_.push_back(std::move(backing_store));
1390template <
typename IsolateT>
1391template <
typename SlotAccessor>
1393 SlotAccessor slot_accessor) {
1395 uint32_t reference_id =
static_cast<uint32_t
>(
source_.GetUint30());
1397 if (main_thread_isolate()->api_external_references()) {
1399 "too few external references provided through the API");
1400 address =
static_cast<Address>(
1401 main_thread_isolate()->api_external_references()[reference_id]);
1406 if (data == kSandboxedApiReference) {
1407 tag = ReadExternalPointerTag();
1409 if (
v8_flags.trace_deserialization) {
1410 PrintF(
"%*sApiReference [%" PRIxPTR
", %i]\n", depth_,
"", address, tag);
1412 return WriteExternalPointer(*slot_accessor.object(),
1413 slot_accessor.external_pointer_slot(tag), address,
1417template <
typename IsolateT>
1418template <
typename SlotAccessor>
1420 uint8_t data, SlotAccessor slot_accessor) {
1421 if (
v8_flags.trace_deserialization) {
1422 PrintF(
"%*sClearedWeakReference\n", depth_,
"");
1427template <
typename IsolateT>
1428template <
typename SlotAccessor>
1430 SlotAccessor slot_accessor) {
1431 if (
v8_flags.trace_deserialization) {
1432 PrintF(
"%*sWeakPrefix\n", depth_,
"");
1435 DCHECK(!next_reference_is_weak_);
1438 next_reference_is_weak_ =
true;
1442template <
typename IsolateT>
1443template <
typename SlotAccessor>
1445 uint8_t data, SlotAccessor slot_accessor) {
1446 if (
v8_flags.trace_deserialization) {
1447 PrintF(
"%*sIndirectPointerPrefix\n", depth_,
"");
1450 DCHECK(!next_reference_is_indirect_pointer_);
1453 next_reference_is_indirect_pointer_ =
true;
1457template <
typename IsolateT>
1458template <
typename SlotAccessor>
1460 uint8_t data, SlotAccessor slot_accessor) {
1461#ifdef V8_ENABLE_SANDBOX
1463 DCHECK(IsExposedTrustedObject(*slot_accessor.object()));
1465 ExposedTrustedObject::kSelfIndirectPointerOffset);
1469 host->init_self_indirect_pointer(
isolate());
1477template <
typename IsolateT>
1478template <
typename SlotAccessor>
1480 uint8_t data, SlotAccessor slot_accessor) {
1481#ifdef V8_ENABLE_LEAPTIERING
1488 if (
v8_flags.trace_deserialization) {
1494 JSDispatchTable::Space* space =
1498 js_dispatch_entries_.push_back(
handle);
1500 slot_accessor.offset(),
handle.value());
1509template <
typename IsolateT>
1510template <
typename SlotAccessor>
1512 SlotAccessor slot_accessor) {
1513#ifdef V8_ENABLE_LEAPTIERING
1516 uint32_t entry_id =
source_.GetUint30();
1517 DCHECK_LT(entry_id, js_dispatch_entries_.size());
1519 if (
v8_flags.trace_deserialization) {
1520 PrintF(
"%*sJSDispatchEntry [%u]\n", depth_,
"", entry_id);
1527 slot_accessor.offset(),
handle.value());
1536template <
typename IsolateT>
1537template <
typename SlotAccessor>
1539 uint8_t data, SlotAccessor slot_accessor) {
1541 DCHECK(!next_reference_is_protected_pointer);
1544 next_reference_is_protected_pointer =
true;
1548template <
typename IsolateT>
1549template <
typename SlotAccessor>
1551 SlotAccessor slot_accessor) {
1555 static_assert(kRootArrayConstantsCount <=
1558 RootIndex root_index = RootArrayConstant::Decode(data);
1561 if (
v8_flags.trace_deserialization) {
1562 PrintF(
"%*sRootArrayConstants [%u] : %s\n", depth_,
"",
1565 return slot_accessor.Write(heap_object, HeapObjectReferenceType::STRONG, 0,
1569template <
typename IsolateT>
1570template <
typename SlotAccessor>
1572 SlotAccessor slot_accessor) {
1573 int index = HotObject::Decode(data);
1575 if (
v8_flags.trace_deserialization) {
1576 PrintF(
"%*sHotObject [%u] : ", depth_,
"", index);
1580 return WriteHeapPointer(slot_accessor, hot_object,
1581 GetAndResetNextReferenceDescriptor());
1584template <
typename IsolateT>
1585template <
typename SlotAccessor>
1587 SlotAccessor slot_accessor) {
1588 using TSlot =
decltype(slot_accessor.slot());
1591 int size_in_tagged = FixedRawDataWithSize::Decode(data);
1592 static_assert(TSlot::kSlotDataSize ==
kTaggedSize ||
1594 int size_in_slots = size_in_tagged / (TSlot::kSlotDataSize /
kTaggedSize);
1599 if (
v8_flags.trace_deserialization) {
1600 PrintF(
"%*sFixedRawData [%u] :", depth_,
"", size_in_tagged);
1601 for (
int i = 0;
i < size_in_tagged; ++
i) {
1609 source_.CopySlots(slot_accessor.slot().location(), size_in_slots);
1610 return size_in_slots;
1613template <
typename IsolateT>
1614template <
typename SlotAccessor>
1616 SlotAccessor slot_accessor) {
1617 int repeats = FixedRepeatRootWithCount::Decode(data);
1618 if (
v8_flags.trace_deserialization) {
1619 PrintF(
"%*sFixedRepeat [%u] : ", depth_,
"", repeats);
1621 int ret = ReadRepeatedRoot(slot_accessor, repeats);
1622 if (
v8_flags.trace_deserialization) {
1628#undef CASE_RANGE_ALL_SPACES
1638template <
typename IsolateT>
1640 uint32_t reference_id =
static_cast<uint32_t
>(
source_.GetUint30());
1641 return main_thread_isolate()->external_reference_table()->address(
1645template <
typename IsolateT>
1650template <
typename IsolateT>
1654 if (!previous_allocation_obj_.is_null()) {
1657 int object_size = previous_allocation_obj_->Size(
isolate_);
1658 DCHECK_LE(object_size, previous_allocation_size_);
1668 previous_allocation_size_ =
size;
interpreter::Bytecode bytecode
UnderlyingType underlying_type
static std::unique_ptr< BackingStore > TryAllocateAndPartiallyCommitMemory(Isolate *isolate, size_t byte_length, size_t max_byte_length, size_t page_size, size_t initial_pages, size_t maximum_pages, WasmMemoryFlag wasm_memory, SharedFlag shared, bool has_guard_regions=false)
static std::unique_ptr< BackingStore > Allocate(Isolate *isolate, size_t byte_length, SharedFlag shared, InitializedFlag initialized)
int ReadRootArray(uint8_t data, SlotAccessor slot_accessor)
int ReadApiReference(uint8_t data, SlotAccessor slot_accessor)
int ReadReadOnlyHeapRef(uint8_t data, SlotAccessor slot_accessor)
int ReadSharedHeapObjectCache(uint8_t data, SlotAccessor slot_accessor)
DirectHandle< HeapObject > ReadObject()
Address ReadExternalReferenceCase()
void PostProcessNewObject(DirectHandle< Map > map, Handle< HeapObject > obj, SnapshotSpace space)
void LogScriptEvents(Tagged< Script > script)
int ReadExternalReference(uint8_t data, SlotAccessor slot_accessor)
void Synchronize(VisitorSynchronization::SyncTag tag) override
int ReadSingleBytecodeData(uint8_t data, SlotAccessor slot_accessor)
void PostProcessNewJSReceiver(Tagged< Map > map, DirectHandle< JSReceiver > obj, InstanceType instance_type, SnapshotSpace space)
int ReadRegisterPendingForwardRef(uint8_t data, SlotAccessor slot_accessor)
int ReadWeakPrefix(uint8_t data, SlotAccessor slot_accessor)
void VisitRootPointers(Root root, const char *description, FullObjectSlot start, FullObjectSlot end) override
int ReadResolvePendingForwardRef(uint8_t data, SlotAccessor slot_accessor)
int ReadClearedWeakReference(uint8_t data, SlotAccessor slot_accessor)
int ReadBackref(uint8_t data, SlotAccessor slot_accessor)
int ReadAllocateJSDispatchEntry(uint8_t data, SlotAccessor slot_accessor)
int ReadRepeatedRoot(SlotGetter slot_getter, int repeat_count)
std::vector< std::shared_ptr< BackingStore > > backing_stores_
int ReadOffHeapBackingStore(uint8_t data, SlotAccessor slot_accessor)
int ReadInitializeSelfIndirectPointer(uint8_t data, SlotAccessor slot_accessor)
int ReadStartupObjectCache(uint8_t data, SlotAccessor slot_accessor)
int ReadFixedRepeatRoot(uint8_t data, SlotAccessor slot_accessor)
Handle< HeapObject > ReadMetaMap(SnapshotSpace space)
int ReadProtectedPointerPrefix(uint8_t data, SlotAccessor slot_accessor)
int ReadFixedRawData(uint8_t data, SlotAccessor slot_accessor)
int ReadNewObject(uint8_t data, SlotAccessor slot_accessor)
int ReadJSDispatchEntry(uint8_t data, SlotAccessor slot_accessor)
ExternalPointerTag ReadExternalPointerTag()
int WriteExternalPointer(Tagged< HeapObject > host, ExternalPointerSlot dest, Address value, ExternalPointerTag tag)
std::vector< JSDispatchHandle > js_dispatch_entries_
int ReadVariableRawData(uint8_t data, SlotAccessor slot_accessor)
int ReadNewMetaMap(uint8_t data, SlotAccessor slot_accessor)
void WeakenDescriptorArrays()
int ReadHotObject(uint8_t data, SlotAccessor slot_accessor)
int ReadAttachedReference(uint8_t data, SlotAccessor slot_accessor)
std::vector< IndirectHandle< HeapObject > > back_refs_
int ReadVariableRepeatRoot(uint8_t data, SlotAccessor slot_accessor)
Tagged< HeapObject > Allocate(AllocationType allocation, int size, AllocationAlignment alignment)
int WriteHeapPointer(SlotAccessor slot_accessor, Tagged< HeapObject > heap_object, ReferenceDescriptor descr, WriteBarrierMode mode=UPDATE_WRITE_BARRIER)
Deserializer(const Deserializer &)=delete
int ReadRawExternalReference(uint8_t data, SlotAccessor slot_accessor)
ReferenceDescriptor GetAndResetNextReferenceDescriptor()
int ReadIndirectPointerPrefix(uint8_t data, SlotAccessor slot_accessor)
void DeserializeDeferredObjects()
void ReadData(Handle< HeapObject > object, int start_slot_index, int end_slot_index)
int ReadRootArrayConstants(uint8_t data, SlotAccessor slot_accessor)
Handle< HeapObject > GetBackReferencedObject()
V8_INLINE Address address() const
static EmbeddedData FromBlob()
static constexpr int kHeaderSize
AllocationType RefineAllocationTypeForInPlaceInternalizableString(AllocationType allocation, Tagged< Map > string_map)
void Relaxed_Store(Tagged< MaybeObject > value) const
void store(Tagged< Object > value) const
void PatchValue(Tagged< T > new_value)
static constexpr int kHeaderSize
static Tagged< HeapObject > FromAddress(Address address)
static AllocationAlignment RequiredAlignment(Tagged< Map > map)
void WeakenDescriptorArrays(GlobalHandleVector< DescriptorArray > strong_descriptor_arrays)
ReadOnlySpace * read_only_space() const
void store(Tagged< ExposedTrustedObject > value) const
void RegisterDeserializerFinished()
StringTable * string_table() const
v8::internal::Factory * factory()
static Maybe< bool > GetResizableBackingStorePageConfiguration(Isolate *isolate, size_t byte_length, size_t max_byte_length, ShouldThrow should_throw, size_t *page_size, size_t *initial_pages, size_t *max_pages)
static constexpr int kEmptyHashField
const std::vector< ReadOnlyPageMetadata * > & pages() const
static const char * name(RootIndex root_index)
static constexpr bool IsReadOnly(RootIndex root_index)
static constexpr uint32_t kMagicNumber
static const uint32_t kEmptyBackingStoreRefSentinel
static bool ShouldBeInSharedHeapObjectCache(Tagged< HeapObject > obj)
int WriteProtectedPointerTo(Tagged< TrustedObject > value, WriteBarrierMode mode)
int Write(DirectHandle< HeapObject > value, HeapObjectReferenceType ref_type, int slot_offset, WriteBarrierMode mode)
Handle< HeapObject > object() const
MaybeObjectSlot slot() const
DirectHandle< HeapObject > * handle_
int WriteIndirectPointerTo(Tagged< HeapObject > value, WriteBarrierMode mode)
int Write(Tagged< HeapObject > value, HeapObjectReferenceType ref_type, int slot_offset, WriteBarrierMode mode)
int Write(Tagged< MaybeObject > value, int slot_offset, WriteBarrierMode mode)
SlotAccessorForHandle(DirectHandle< HeapObject > *handle, IsolateT *isolate)
ExternalPointerSlot external_pointer_slot(ExternalPointerTag tag) const
Handle< HeapObject > object() const
static SlotAccessorForHeapObject ForSlotIndex(Handle< HeapObject > object, int index)
int Write(Tagged< MaybeObject > value, int slot_offset, WriteBarrierMode mode)
SlotAccessorForHeapObject(Handle< HeapObject > object, int offset)
int Write(DirectHandle< HeapObject > value, HeapObjectReferenceType ref_type, int slot_offset, WriteBarrierMode mode)
int WriteIndirectPointerTo(Tagged< HeapObject > value, WriteBarrierMode mode)
ExternalPointerSlot external_pointer_slot(ExternalPointerTag tag) const
int WriteProtectedPointerTo(Tagged< TrustedObject > value, WriteBarrierMode mode)
static SlotAccessorForHeapObject ForSlotOffset(Handle< HeapObject > object, int offset)
const Handle< HeapObject > object_
MaybeObjectSlot slot() const
int Write(Tagged< HeapObject > value, HeapObjectReferenceType ref_type, int slot_offset, WriteBarrierMode mode)
int WriteIndirectPointerTo(Tagged< HeapObject > value, WriteBarrierMode mode)
const FullMaybeObjectSlot slot_
FullMaybeObjectSlot slot() const
SlotAccessorForRootSlots(FullMaybeObjectSlot slot)
int Write(Tagged< MaybeObject > value, int slot_offset, WriteBarrierMode mode)
int Write(Tagged< HeapObject > value, HeapObjectReferenceType ref_type, int slot_offset, WriteBarrierMode mode)
int WriteProtectedPointerTo(Tagged< TrustedObject > value, WriteBarrierMode mode)
int Write(DirectHandle< HeapObject > value, HeapObjectReferenceType ref_type, int slot_offset, WriteBarrierMode mode)
ExternalPointerSlot external_pointer_slot(ExternalPointerTag tag) const
Handle< HeapObject > object() const
static constexpr Tagged< Smi > uninitialized_deserialization_value()
bool IsMatch(IsolateT *isolate, Tagged< String > string)
StringTableInsertionKey(Isolate *isolate, DirectHandle< String > string, DeserializingUserCodeOption deserializing_user_code)
DirectHandle< String > string_
DirectHandle< String > LookupKey(IsolateT *isolate, StringTableKey *key)
static bool IsInPlaceInternalizable(Tagged< String > string)
static void ForProtectedPointer(Tagged< TrustedObject > host, ProtectedPointerSlot slot, Tagged< TrustedObject > value, WriteBarrierMode mode=UPDATE_WRITE_BARRIER)
static void ForIndirectPointer(Tagged< HeapObject > host, IndirectPointerSlot slot, Tagged< HeapObject > value, WriteBarrierMode mode=UPDATE_WRITE_BARRIER)
static void ForValue(Tagged< HeapObject > host, MaybeObjectSlot slot, Tagged< T > value, WriteBarrierMode mode)
#define V8_ENABLE_SANDBOX_BOOL
DirectHandle< String > string_
#define CASE_RANGE_ALL_SPACES(bytecode)
#define CASE_RANGE(byte_code, num_bytecodes)
#define EXPORT_TEMPLATE_DEFINE(export)
ZoneVector< RpoNumber > & result
#define LOG(isolate, Call)
InstructionOperand source
V8_INLINE constexpr bool IsExternalString(InstanceType instance_type)
V8_INLINE constexpr bool IsInternalizedString(InstanceType instance_type)
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
static V8_INLINE bool HasWeakHeapObjectTag(const Tagged< Object > value)
constexpr int kTaggedSize
DeserializingUserCodeOption
@ kIsDeserializingUserCode
PerThreadAssertScopeDebugOnly< false, SAFEPOINTS_ASSERT, HEAP_ALLOCATION_ASSERT > DisallowGarbageCollection
void PrintF(const char *format,...)
Tagged(T object) -> Tagged< T >
void MemsetTagged(Tagged_t *start, Tagged< MaybeObject > value, size_t counter)
V8_INLINE DirectHandle< T > direct_handle(Tagged< T > object, Isolate *isolate)
too high values may cause the compiler to set high thresholds for inlining to as much as possible avoid inlined allocation of objects that cannot escape trace load stores from virtual maglev objects use TurboFan fast string builder analyze liveness of environment slots and zap dead values trace TurboFan load elimination emit data about basic block usage in builtins to this enable builtin reordering when run mksnapshot flag for emit warnings when applying builtin profile data verify register allocation in TurboFan randomly schedule instructions to stress dependency tracking enable store store elimination in TurboFan rewrite far to near simulate GC compiler thread race related to allow float parameters to be passed in simulator mode JS Wasm Run additional turbo_optimize_inlined_js_wasm_wrappers enable experimental feedback collection in generic lowering enable Turboshaft s WasmLoadElimination enable Turboshaft s low level load elimination for JS enable Turboshaft s escape analysis for string concatenation use enable Turbolev features that we want to ship in the not too far future trace individual Turboshaft reduction steps trace intermediate Turboshaft reduction steps invocation count threshold for early optimization Enables optimizations which favor memory size over execution speed Enables sampling allocation profiler with X as a sample interval min size of a semi the new space consists of two semi spaces max size of the Collect garbage after Collect garbage after keeps maps alive for< n > old space garbage collections print one detailed trace line in name
void NoExternalReferencesCallback()
Handle< To > UncheckedCast(Handle< From > value)
constexpr int kSystemPointerSize
constexpr ExternalPointerHandle kNullExternalPointerHandle
constexpr JSDispatchHandle kNullJSDispatchHandle(0)
V8_INLINE void * EmptyBackingStoreBuffer()
void ShortPrint(Tagged< Object > obj, FILE *out)
constexpr int kExternalPointerSlotSize
Tagged< ClearedWeakValue > ClearedValue(PtrComprCageBase cage_base)
@ kExternalPointerNullTag
V8_EXPORT_PRIVATE FlagValues v8_flags
static V8_INLINE constexpr bool IsManagedExternalPointerType(ExternalPointerTagRange tag_range)
uint32_t ExternalPointerHandle
static constexpr Address kNullAddress
@ kLastImmortalImmovableRoot
@ kFirstImmortalImmovableRoot
V8_INLINE IndirectPointerTag IndirectPointerTagFromInstanceType(InstanceType instance_type)
V8_INLINE constexpr bool FastInReadOnlySpaceOrSmallSmi(Tagged_t obj)
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
#define JS_DISPATCH_HANDLE_WRITE_BARRIER(object, handle)
#define UNUSED_SERIALIZER_BYTE_CODES(V)
#define DCHECK_LE(v1, v2)
#define DCHECK_WITH_MSG(condition, msg)
#define CHECK_LE(lhs, rhs)
#define DCHECK_NOT_NULL(val)
#define CHECK_NOT_NULL(val)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK_NE(v1, v2)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
#define V8_EXPORT_PRIVATE
HeapObjectReferenceType type
#define V8_STATIC_ROOTS_BOOL
#define V8_LIKELY(condition)