30#ifdef V8_SNAPSHOT_COMPRESSION
39class SnapshotImpl :
public AllStatic {
42 const SnapshotData* startup_snapshot_in,
43 const SnapshotData* read_only_snapshot_in,
44 const SnapshotData* shared_heap_snapshot_in,
45 const std::vector<SnapshotData*>& context_snapshots_in,
46 bool can_be_rehashed);
51 static base::Vector<const uint8_t> ExtractStartupData(
53 static base::Vector<const uint8_t> ExtractReadOnlyData(
55 static base::Vector<const uint8_t> ExtractSharedHeapData(
57 static base::Vector<const uint8_t> ExtractContextData(
66 static void SetHeaderValue(
char* data, uint32_t
offset, uint32_t value) {
108 static base::Vector<const uint8_t> ChecksummedContent(
118 return base::Vector<const uint8_t>(
119 reinterpret_cast<const uint8_t*
>(data->data + kChecksumStart),
120 data->raw_size - kChecksumStart);
123 static uint32_t StartupSnapshotOffset(
int num_contexts) {
128 static uint32_t ContextSnapshotOffsetOffset(
int index) {
137#ifdef V8_SNAPSHOT_COMPRESSION
139 RCS_SCOPE(isolate, RuntimeCallCounterId::kSnapshotDecompress);
141 isolate->counters()->snapshot_decompress());
150 return SnapshotImpl::ExtractNumContexts(snapshot_blob) > 0;
157 if (blob ==
nullptr)
return false;
158 if (blob->data ==
nullptr)
return false;
159 size_t num_contexts =
160 static_cast<size_t>(SnapshotImpl::ExtractNumContexts(blob));
161 return index < num_contexts;
165 char version[SnapshotImpl::kVersionStringLength];
166 memset(version, 0, SnapshotImpl::kVersionStringLength);
168 SnapshotImpl::kVersionStringOffset + SnapshotImpl::kVersionStringLength,
169 static_cast<uint32_t
>(data->raw_size));
172 return strncmp(version, data->data + SnapshotImpl::kVersionStringOffset,
173 SnapshotImpl::kVersionStringLength) == 0;
177 if (!isolate->snapshot_available())
return false;
180 SnapshotImpl::CheckVersion(blob);
186 SnapshotImpl::ExtractStartupData(blob);
188 SnapshotImpl::ExtractReadOnlyData(blob);
190 SnapshotImpl::ExtractSharedHeapData(blob);
198 return isolate->InitWithSnapshot(
199 &startup_snapshot_data, &read_only_snapshot_data,
205 size_t context_index,
212 blob,
static_cast<uint32_t
>(context_index));
216 isolate, &snapshot_data, context_index, can_rehash, global_proxy,
217 embedder_fields_deserializer);
222 Isolate* isolate,
bool clear_recompilable_data) {
228 std::vector<i::Handle<i::SharedFunctionInfo>> sfis_to_clear;
233 if (clear_recompilable_data && IsSharedFunctionInfo(o, cage_base)) {
236 if (IsScript(shared->script(cage_base), cage_base) &&
241 if (shared->CanDiscardCompiled()) {
242 sfis_to_clear.emplace_back(shared, isolate);
244 }
else if (IsJSRegExp(o, cage_base)) {
246 if (regexp->has_data()) {
248 if (data->HasCompiledCode()) {
257#if V8_ENABLE_WEBASSEMBLY
260 isolate->heap()->js_to_wasm_wrappers(), isolate);
267 if (shared->CanDiscardCompiled()) {
268 i::SharedFunctionInfo::DiscardCompiled(isolate, shared);
277 if (!IsJSFunction(o, cage_base))
continue;
280 fun->CompleteInobjectSlackTrackingIfActive();
283 if (IsScript(shared->script(cage_base), cage_base) &&
290 if (fun->CanDiscardCompiled(isolate)) {
293 if (!IsUndefined(fun->raw_feedback_cell(cage_base)->value(cage_base))) {
294 fun->raw_feedback_cell(cage_base)->set_value(
298 if (clear_recompilable_data) {
299#if V8_ENABLE_WEBASSEMBLY
300 DCHECK(fun->shared()->HasWasmExportedFunctionData() ||
301 fun->shared()->HasBuiltinId() ||
302 fun->shared()->IsApiFunction() ||
303 fun->shared()->HasUncompiledDataWithoutPreparseData());
305 DCHECK(fun->shared()->HasBuiltinId() ||
306 fun->shared()->IsApiFunction() ||
307 fun->shared()->HasUncompiledDataWithoutPreparseData());
317 isolate->heap()->SetFunctionsMarkedForManualOptimization(
318 roots.undefined_value());
320#if V8_ENABLE_WEBASSEMBLY
330 if (IsJSFunction(o)) {
332 if (fun->shared()->HasAsmWasmData()) {
333 FATAL(
"asm.js functions are not supported in snapshots");
335 if (fun->shared()->HasWasmExportedFunctionData()) {
337 "Exported WebAssembly functions are not supported in snapshots");
349 std::unique_ptr<const char[]> auto_delete_serialized_data;
351 isolate->heap()->CollectAllAvailableGarbage(
352 i::GarbageCollectionReason::kSnapshotCreator);
366 std::vector<Tagged<Context>> contexts{*default_context};
367 std::vector<SerializeEmbedderFieldsCallback> callbacks{
370 safepoint_scope, no_gc, flags);
371 auto_delete_serialized_data.reset(serialized_data.
data);
377 isolate->main_thread_local_isolate()->ExecuteMainThreadWhileParked(
378 [&serialized_data]() {
381 std::unique_ptr<v8::ArrayBuffer::Allocator> array_buffer_allocator(
388 new_isolate->
Enter();
389 new_isolate->set_snapshot_blob(&serialized_data);
396 CHECK(IsNativeContext(*new_native_context));
411 const std::vector<SerializeEmbedderFieldsCallback>&
412 embedder_fields_serializers,
416 DCHECK_EQ(contexts->size(), embedder_fields_serializers.size());
431 const int num_contexts =
static_cast<int>(contexts->size());
432 std::vector<SnapshotData*> context_snapshots;
433 context_snapshots.reserve(num_contexts);
435 std::vector<int> context_allocation_sizes;
436 for (
int i = 0;
i < num_contexts;
i++) {
438 embedder_fields_serializers[
i]);
439 context_serializer.
Serialize(&contexts->at(
i), no_gc);
440 can_be_rehashed = can_be_rehashed && context_serializer.
can_be_rehashed();
441 context_snapshots.push_back(
new SnapshotData(&context_serializer));
442 if (
v8_flags.serialization_statistics) {
443 context_allocation_sizes.push_back(
449 can_be_rehashed = can_be_rehashed && startup_serializer.
can_be_rehashed();
454 can_be_rehashed = can_be_rehashed && shared_heap_serializer.
can_be_rehashed();
456 if (
v8_flags.serialization_statistics) {
462 int per_process_allocation_size =
470 PrintF(
"Deserialization will allocate:\n");
471 PrintF(
"%10d bytes per process\n", per_process_allocation_size);
472 PrintF(
"%10d bytes per isolate\n", per_isolate_allocation_size);
473 for (
int i = 0;
i < num_contexts;
i++) {
475 PrintF(
"%10d bytes per context #%d\n", context_allocation_sizes[
i],
i);
481 SnapshotData shared_heap_snapshot(&shared_heap_serializer);
484 &startup_snapshot, &read_only_snapshot, &shared_heap_snapshot,
485 context_snapshots, can_be_rehashed);
487 for (
const SnapshotData* ptr : context_snapshots)
delete ptr;
497 const std::vector<SnapshotData*>& context_snapshots_in,
498 bool can_be_rehashed) {
505 const std::vector<SnapshotData*>* context_snapshots;
506#ifdef V8_SNAPSHOT_COMPRESSION
508 SnapshotCompression::Compress(startup_snapshot_in));
510 SnapshotCompression::Compress(read_only_snapshot_in));
512 SnapshotCompression::Compress(shared_heap_snapshot_in));
513 startup_snapshot = &startup_compressed;
514 read_only_snapshot = &read_only_compressed;
515 shared_heap_snapshot = &shared_heap_compressed;
516 std::vector<SnapshotData> context_snapshots_compressed;
517 context_snapshots_compressed.reserve(context_snapshots_in.size());
518 std::vector<SnapshotData*> context_snapshots_compressed_ptrs;
519 for (
unsigned int i = 0;
i < context_snapshots_in.size(); ++
i) {
520 context_snapshots_compressed.push_back(
521 SnapshotCompression::Compress(context_snapshots_in[
i]));
522 context_snapshots_compressed_ptrs.push_back(
523 &context_snapshots_compressed[
i]);
525 context_snapshots = &context_snapshots_compressed_ptrs;
527 startup_snapshot = startup_snapshot_in;
528 read_only_snapshot = read_only_snapshot_in;
529 shared_heap_snapshot = shared_heap_snapshot_in;
530 context_snapshots = &context_snapshots_in;
533 uint32_t num_contexts =
static_cast<uint32_t
>(context_snapshots->size());
534 uint32_t startup_snapshot_offset =
535 SnapshotImpl::StartupSnapshotOffset(num_contexts);
536 uint32_t total_length = startup_snapshot_offset;
537 total_length +=
static_cast<uint32_t
>(startup_snapshot->
RawData().
length());
538 total_length +=
static_cast<uint32_t
>(read_only_snapshot->
RawData().
length());
540 static_cast<uint32_t
>(shared_heap_snapshot->
RawData().
length());
541 for (
const auto context_snapshot : *context_snapshots) {
542 total_length +=
static_cast<uint32_t
>(context_snapshot->RawData().
length());
545 char* data =
new char[total_length];
547 memset(data, 0, SnapshotImpl::StartupSnapshotOffset(num_contexts));
549 SnapshotImpl::SetHeaderValue(data, SnapshotImpl::kNumberOfContextsOffset,
551 SnapshotImpl::SetHeaderValue(data, SnapshotImpl::kRehashabilityOffset,
552 can_be_rehashed ? 1 : 0);
555 memset(data + SnapshotImpl::kVersionStringOffset, 0,
556 SnapshotImpl::kVersionStringLength);
558 base::Vector<char>(data + SnapshotImpl::kVersionStringOffset,
559 SnapshotImpl::kVersionStringLength));
562 uint32_t payload_offset = startup_snapshot_offset;
563 uint32_t payload_length =
565 CopyBytes(data + payload_offset,
566 reinterpret_cast<const char*
>(startup_snapshot->
RawData().
begin()),
568 if (v8_flags.serialization_statistics) {
570 PrintF(
"Snapshot blob consists of:\n");
571 PrintF(
"%10d bytes for startup\n", payload_length);
573 payload_offset += payload_length;
576 SnapshotImpl::SetHeaderValue(data, SnapshotImpl::kReadOnlyOffsetOffset,
580 data + payload_offset,
581 reinterpret_cast<const char*
>(read_only_snapshot->
RawData().
begin()),
583 SnapshotImpl::SetHeaderValue(
584 data, SnapshotImpl::kReadOnlySnapshotChecksumOffset,
586 reinterpret_cast<const uint8_t*
>(data + payload_offset),
588 if (
v8_flags.serialization_statistics) {
590 PrintF(
"%10d bytes for read-only\n", payload_length);
592 payload_offset += payload_length;
595 SnapshotImpl::SetHeaderValue(data, SnapshotImpl::kSharedHeapOffsetOffset,
599 data + payload_offset,
600 reinterpret_cast<const char*
>(shared_heap_snapshot->
RawData().
begin()),
602 if (
v8_flags.serialization_statistics) {
604 PrintF(
"%10d bytes for shared heap\n", payload_length);
606 payload_offset += payload_length;
609 for (uint32_t
i = 0;
i < num_contexts;
i++) {
610 SnapshotImpl::SetHeaderValue(
611 data, SnapshotImpl::ContextSnapshotOffsetOffset(
i), payload_offset);
612 SnapshotData* context_snapshot = (*context_snapshots)[
i];
613 payload_length = context_snapshot->RawData().length();
615 data + payload_offset,
616 reinterpret_cast<const char*
>(context_snapshot->RawData().begin()),
618 if (
v8_flags.serialization_statistics) {
620 PrintF(
"%10d bytes for context #%d\n", payload_length,
i);
622 payload_offset += payload_length;
629 SnapshotImpl::SetHeaderValue(
630 data, SnapshotImpl::kChecksumOffset,
636uint32_t SnapshotImpl::ExtractNumContexts(
const v8::StartupData* data) {
641 return SnapshotImpl::GetHeaderValue(data, SnapshotImpl::kChecksumOffset);
644 return Checksum(SnapshotImpl::ChecksummedContent(data));
650 uint32_t expected = GetExpectedChecksum(data);
651 uint32_t
result = CalculateChecksum(data);
652 if (
v8_flags.profile_deserialization) {
653 double ms = timer.Elapsed().InMillisecondsF();
654 PrintF(
"[Verifying snapshot checksum took %0.3f ms]\n", ms);
656 return result == expected;
659uint32_t SnapshotImpl::ExtractContextOffset(
const v8::StartupData* data,
663 uint32_t context_offset =
664 GetHeaderValue(data, ContextSnapshotOffsetOffset(index));
665 CHECK_LT(context_offset,
static_cast<uint32_t
>(data->raw_size));
666 return context_offset;
670 uint32_t rehashability =
671 SnapshotImpl::GetHeaderValue(data, SnapshotImpl::kRehashabilityOffset);
673 return rehashability != 0;
679 return SnapshotImpl::GetHeaderValue(
680 data, SnapshotImpl::kReadOnlySnapshotChecksumOffset);
685 uint32_t start_offset,
686 uint32_t end_offset) {
688 CHECK_LT(end_offset, snapshot->raw_size);
689 uint32_t length = end_offset - start_offset;
690 const uint8_t* data =
691 reinterpret_cast<const uint8_t*
>(snapshot->data + start_offset);
696base::Vector<const uint8_t> SnapshotImpl::ExtractStartupData(
698 DCHECK(Snapshot::SnapshotIsValid(data));
700 uint32_t num_contexts = ExtractNumContexts(data);
701 return ExtractData(data, StartupSnapshotOffset(num_contexts),
705base::Vector<const uint8_t> SnapshotImpl::ExtractReadOnlyData(
707 DCHECK(Snapshot::SnapshotIsValid(data));
713base::Vector<const uint8_t> SnapshotImpl::ExtractSharedHeapData(
715 DCHECK(Snapshot::SnapshotIsValid(data));
718 GetHeaderValue(data, ContextSnapshotOffsetOffset(0)));
721base::Vector<const uint8_t> SnapshotImpl::ExtractContextData(
723 uint32_t num_contexts = ExtractNumContexts(data);
726 uint32_t context_offset = ExtractContextOffset(data, index);
727 uint32_t next_context_offset;
728 if (index == num_contexts - 1) {
729 next_context_offset = data->raw_size;
731 next_context_offset = ExtractContextOffset(data, index + 1);
732 CHECK_LT(next_context_offset, data->raw_size);
735 const uint8_t* context_data =
736 reinterpret_cast<const uint8_t*
>(data->data + context_offset);
737 uint32_t context_length = next_context_offset - context_offset;
738 return base::Vector<const uint8_t>(context_data, context_length);
742 if (!Snapshot::VersionIsValid(data)) {
746 static_cast<uint32_t
>(data->raw_size));
749 "Version mismatch between V8 binary and snapshot.\n"
750 "# V8 binary version: %.*s\n"
751 "# Snapshot version: %.*s\n"
752 "# The snapshot consists of %d bytes and contains %d context(s).",
755 ExtractNumContexts(data));
762 const char* utf8_source,
const char* name) {
777 if (script->Run(context).IsEmpty())
return false;
778 CHECK(!try_catch.HasCaught());
794 if (embedded_source !=
nullptr &&
795 !RunExtraCode(v8_isolate, context, embedded_source,
"<embedded>")) {
801 return creator->
CreateBlob(function_code_handling, serializer_flags);
807 std::unique_ptr<v8::ArrayBuffer::Allocator> array_buffer_allocator(
813 creator, serializer_flags);
818 const char* embedded_source) {
835 std::unique_ptr<v8::ArrayBuffer::Allocator> allocator(
839 params.array_buffer_allocator = allocator.get();
845 if (!RunExtraCode(isolate, context, warmup_source,
"<warm-up>")) {
864 if (blob !=
nullptr && blob->raw_size > 0) {
871#ifdef V8_ENABLE_SPARKPLUG
872 isolate_->baseline_batch_compiler()->set_enabled(
false);
878 DCHECK_EQ(contexts_.size(), kDefaultContextIndex + 1);
882 Isolate* isolate,
const intptr_t* api_external_references,
883 const StartupData* existing_blob,
bool owns_isolate)
884 : owns_isolate_(owns_isolate),
886 array_buffer_allocator_(
ArrayBuffer::Allocator::NewDefaultAllocator()) {
890 isolate_->set_api_external_references(api_external_references);
898 if (
auto allocator = params.array_buffer_allocator_shared) {
899 CHECK(params.array_buffer_allocator == nullptr ||
900 params.array_buffer_allocator == allocator.get());
901 isolate_->set_array_buffer_allocator(allocator.get());
902 isolate_->set_array_buffer_allocator_shared(std::move(allocator));
904 CHECK_NOT_NULL(params.array_buffer_allocator);
905 isolate_->set_array_buffer_allocator(params.array_buffer_allocator);
907 isolate_->set_api_external_references(params.external_references);
910 InitInternal(params.snapshot_blob ? params.snapshot_blob
916 : owns_isolate_(false),
isolate_(isolate) {
917 if (
auto allocator = params.array_buffer_allocator_shared) {
918 CHECK(params.array_buffer_allocator == nullptr ||
919 params.array_buffer_allocator == allocator.get());
920 isolate_->set_array_buffer_allocator(allocator.get());
921 isolate_->set_array_buffer_allocator_shared(std::move(allocator));
923 CHECK_NOT_NULL(params.array_buffer_allocator);
924 isolate_->set_array_buffer_allocator(params.array_buffer_allocator);
926 isolate_->set_api_external_references(params.external_references);
929 InitInternal(params.snapshot_blob ? params.snapshot_blob
952 DCHECK(!context.is_null());
963 DCHECK(!context.is_null());
980 if (!IsArrayList(context->serialized_objects())) {
986 size_t index =
static_cast<size_t>(list->length());
988 context->set_serialized_objects(*list);
998 if (!IsArrayList(
isolate_->
heap()->serialized_objects())) {
1004 size_t index =
static_cast<size_t>(list->length());
1016void ConvertSerializedObjectsToFixedArray(
Isolate* isolate) {
1017 if (!IsArrayList(isolate->heap()->serialized_objects())) {
1018 isolate->heap()->SetSerializedObjects(
1021 DirectHandle<ArrayList> list(
1024 isolate->heap()->SetSerializedObjects(*elements);
1028void ConvertSerializedObjectsToFixedArray(Isolate* isolate,
1029 DirectHandle<NativeContext> context) {
1030 if (!IsArrayList(context->serialized_objects())) {
1031 context->set_serialized_objects(ReadOnlyRoots(isolate).empty_fixed_array());
1033 DirectHandle<ArrayList> list(
Cast<ArrayList>(context->serialized_objects()),
1036 context->set_serialized_objects(*elements);
1049 const size_t num_contexts =
contexts_.size();
1050 const size_t num_additional_contexts = num_contexts - 1;
1058 ConvertSerializedObjectsToFixedArray(
isolate_);
1061 for (
size_t i = 0;
i < num_contexts;
i++) {
1071 global_proxy_sizes->set(
1089 StackState::kNoHeapPointers);
1132 std::vector<Tagged<Context>> raw_contexts;
1133 raw_contexts.reserve(num_contexts);
1136 for (
size_t i = 0;
i < num_contexts;
i++) {
1150 std::vector<SerializeEmbedderFieldsCallback> raw_callbacks;
1151 raw_callbacks.reserve(num_contexts);
1152 for (
size_t i = 0;
i < num_contexts;
i++) {
1158 safepoint_scope, no_gc_from_here_on,
1164 return snapshot_creator->
impl_;
union v8::internal::@341::BuiltinMetadata::KindSpecificData data
#define BUILTIN_CODE(isolate, name)
static Allocator * NewDefaultAllocator()
static Local< Context > New(Isolate *isolate, ExtensionConfiguration *extensions=nullptr, MaybeLocal< ObjectTemplate > global_template=MaybeLocal< ObjectTemplate >(), MaybeLocal< Value > global_object=MaybeLocal< Value >(), DeserializeInternalFieldsCallback internal_fields_deserializer=DeserializeInternalFieldsCallback(), MicrotaskQueue *microtask_queue=nullptr, DeserializeContextDataCallback context_data_deserializer=DeserializeContextDataCallback(), DeserializeAPIWrapperCallback api_wrapper_deserializer=DeserializeAPIWrapperCallback())
static V8_WARN_UNUSED_RESULT MaybeLocal< Script > Compile(Local< Context > context, Source *source, CompileOptions options=kNoCompileOptions, NoCacheReason no_cache_reason=kNoCacheNoReason)
void SetDefaultContext(Local< Context > context, SerializeInternalFieldsCallback internal_fields_serializer=SerializeInternalFieldsCallback(), SerializeContextDataCallback context_data_serializer=SerializeContextDataCallback(), SerializeAPIWrapperCallback api_wrapper_serializer=SerializeAPIWrapperCallback())
StartupData CreateBlob(FunctionCodeHandling function_code_handling)
internal::SnapshotCreatorImpl * impl_
static V8_WARN_UNUSED_RESULT MaybeLocal< String > NewFromUtf8(Isolate *isolate, const char *data, NewStringType type=NewStringType::kNormal, int length=-1)
static v8::internal::DirectHandle< To > OpenDirectHandle(v8::Local< From > handle)
constexpr T * begin() const
static V8_EXPORT_PRIVATE DirectHandle< ArrayList > Add(Isolate *isolate, DirectHandle< ArrayList > array, Tagged< Smi > obj, AllocationType allocation=AllocationType::kYoung)
static V8_EXPORT_PRIVATE DirectHandle< FixedArray > ToFixedArray(Isolate *isolate, DirectHandle< ArrayList > array, AllocationType allocation=AllocationType::kYoung)
static DirectHandle< ArrayList > New(IsolateT *isolate, int capacity, AllocationType allocation=AllocationType::kYoung)
DirectHandle< NativeContext > CreateEnvironmentForTesting()
static MaybeDirectHandle< Context > DeserializeContext(Isolate *isolate, const SnapshotData *data, size_t context_index, bool can_rehash, DirectHandle< JSGlobalProxy > global_proxy, DeserializeEmbedderFieldsCallback embedder_fields_deserializer)
void Serialize(Tagged< Context > *o, const DisallowGarbageCollection &no_gc)
bool can_be_rehashed() const
static V8_INLINE DirectHandle FromSlot(Address *slot)
Handle< FixedArray > NewFixedArray(int length, AllocationType allocation=AllocationType::kYoung)
static void Destroy(Address *location)
IndirectHandle< Object > Create(Tagged< Object > value)
static void VerifyHeap(Heap *heap)
void CompactWeakArrayLists()
void ConfigureHeap(const v8::ResourceConstraints &constraints, v8::CppHeap *cpp_heap)
V8_EXPORT_PRIVATE void CollectAllAvailableGarbage(GarbageCollectionReason gc_reason)
void SetSerializedObjects(Tagged< HeapObject > objects)
ReadOnlySpace * read_only_space() const
void SetSerializedGlobalProxySizes(Tagged< FixedArray > sizes)
GlobalHandles * global_handles() const
ReadOnlyHeap * read_only_heap() const
Bootstrapper * bootstrapper()
static void Delete(Isolate *isolate)
bool has_shared_space() const
DescriptorLookupCache * descriptor_lookup_cache() const
v8::internal::Factory * factory()
void set_array_buffer_allocator(v8::ArrayBuffer::Allocator *allocator)
V8_EXPORT_PRIVATE void OnCreateHeapObjectsComplete(Isolate *isolate)
bool can_be_rehashed() const
bool CheckGlobalAndEternalHandles()
int TotalAllocationSize() const
void FinalizeSerialization()
static constexpr Tagged< Smi > FromInt(int value)
static V8_EXPORT_PRIVATE SnapshotData Decompress(base::Vector< const uint8_t > compressed_data)
static constexpr size_t kFirstAddtlContextIndex
void SetDefaultContext(DirectHandle< NativeContext > context, SerializeEmbedderFieldsCallback callback)
size_t AddContext(DirectHandle< NativeContext > context, SerializeEmbedderFieldsCallback callback)
Isolate * isolate() const
static constexpr size_t kDefaultContextIndex
std::vector< SerializableContext > contexts_
SnapshotCreatorImpl(Isolate *isolate, const intptr_t *api_external_references, const StartupData *existing_blob, bool owns_isolate)
size_t AddData(DirectHandle< NativeContext > context, Address object)
static SnapshotCreatorImpl * FromSnapshotCreator(v8::SnapshotCreator *snapshot_creator)
DirectHandle< NativeContext > context_at(size_t i) const
void InitInternal(const StartupData *)
StartupData CreateBlob(SnapshotCreator::FunctionCodeHandling function_code_handling, Snapshot::SerializerFlags serializer_flags=Snapshot::kDefaultSerializerFlags)
std::unique_ptr< v8::ArrayBuffer::Allocator > array_buffer_allocator_
base::Vector< const uint8_t > RawData() const
static bool VersionIsValid(const v8::StartupData *data)
static V8_EXPORT_PRIVATE void ClearReconstructableDataForSerialization(Isolate *isolate, bool clear_recompilable_data)
static V8_EXPORT_PRIVATE void SerializeDeserializeAndVerifyForTesting(Isolate *isolate, DirectHandle< Context > default_context)
static v8::StartupData Create(Isolate *isolate, std::vector< Tagged< Context > > *contexts, const std::vector< SerializeEmbedderFieldsCallback > &embedder_fields_serializers, const SafepointScope &safepoint_scope, const DisallowGarbageCollection &no_gc, SerializerFlags flags=kDefaultSerializerFlags)
static bool ExtractRehashability(const v8::StartupData *data)
static bool Initialize(Isolate *isolate)
static const v8::StartupData * DefaultSnapshotBlob()
static V8_EXPORT_PRIVATE uint32_t GetExpectedChecksum(const v8::StartupData *data)
@ kReconstructReadOnlyAndSharedObjectCachesForTesting
@ kAllowActiveIsolateForTesting
@ kAllowUnknownExternalReferencesForTesting
static bool HasContextSnapshot(Isolate *isolate, size_t index)
static V8_EXPORT_PRIVATE uint32_t CalculateChecksum(const v8::StartupData *data)
static MaybeDirectHandle< Context > NewContextFromSnapshot(Isolate *isolate, DirectHandle< JSGlobalProxy > global_proxy, size_t context_index, DeserializeEmbedderFieldsCallback embedder_fields_deserializer)
static bool ShouldVerifyChecksum(const v8::StartupData *data)
static V8_EXPORT_PRIVATE bool VerifyChecksum(const v8::StartupData *data)
static V8_EXPORT_PRIVATE uint32_t ExtractReadOnlySnapshotChecksum(const v8::StartupData *data)
void SerializeWeakReferencesAndDeferred()
void SerializeStrongReferences(const DisallowGarbageCollection &no_gc)
void CheckNoDirtyFinalizationRegistries()
V8_INLINE constexpr bool is_null() const
static void GetString(base::Vector< char > str)
#define POINTER_SIZE_ALIGN(value)
ZoneVector< RpoNumber > & result
InstructionOperand source
static void WriteLittleEndianValue(Address p, V value)
static V ReadLittleEndianValue(Address p)
void CopyBytes(T *dst, const T *src, size_t num_bytes)
v8::StartupData CreateSnapshotDataBlobInternalForInspectorTest(v8::SnapshotCreator::FunctionCodeHandling function_code_handling, const char *embedded_source)
SnapshotData MaybeDecompress(Isolate *isolate, base::Vector< const uint8_t > snapshot_data)
bool Is(IndirectHandle< U > value)
void PrintF(const char *format,...)
void MemsetTagged(Tagged_t *start, Tagged< MaybeObject > value, size_t counter)
V8_INLINE DirectHandle< T > direct_handle(Tagged< T > object, Isolate *isolate)
Tagged< ClearedWeakValue > ClearedValue(PtrComprCageBase cage_base)
V8_EXPORT_PRIVATE FlagValues v8_flags
v8::StartupData WarmUpSnapshotDataBlobInternal(v8::StartupData cold_snapshot_blob, const char *warmup_source)
constexpr int kUInt32Size
static constexpr Address kNullAddress
v8::StartupData CreateSnapshotDataBlobInternal(v8::SnapshotCreator::FunctionCodeHandling function_code_handling, const char *embedded_source, SnapshotCreator &snapshot_creator, Snapshot::SerializerFlags serializer_flags)
uint32_t Checksum(base::Vector< const uint8_t > payload)
kInterpreterTrampolineOffset script
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
bool ToLocal(v8::internal::MaybeDirectHandle< v8::internal::Object > maybe, Local< T > *local)
static const uint32_t kRehashabilityOffset
static const uint32_t kFirstContextOffsetOffset
static const uint32_t kReadOnlySnapshotChecksumOffset
static const uint32_t kSharedHeapOffsetOffset
static const uint32_t kVersionStringLength
static const uint32_t kNumberOfContextsOffset
static const uint32_t kReadOnlyOffsetOffset
static const uint32_t kVersionStringOffset
static const uint32_t kChecksumOffset
#define GRACEFUL_FATAL(...)
#define CHECK_IMPLIES(lhs, rhs)
#define CHECK_LT(lhs, rhs)
#define DCHECK_NOT_NULL(val)
#define CHECK_NOT_NULL(val)
#define DCHECK_NE(v1, v2)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
#define DCHECK_GT(v1, v2)
ArrayBuffer::Allocator * array_buffer_allocator
const StartupData * snapshot_blob
#define TRACE_EVENT0(category_group, name)