35 : owns_data_(false), rejected_(false),
data_(data),
length_(length) {
47 source_hash_(source_hash) {}
54 isolate->counters()->compile_serialize());
55 RCS_SCOPE(isolate, RuntimeCallCounterId::kCompileSerialize);
62 PrintF(
"[Serializing from");
66#if V8_ENABLE_WEBASSEMBLY
69 if (script->ContainsAsmModule())
return nullptr;
75 if (script->is_wrapped()) {
83 script->origin_options()));
87 cs.reference_map()->AddAttachedReference(*source);
91 if (
v8_flags.profile_deserialization) {
92 double ms = timer.Elapsed().InMillisecondsF();
93 int length = cached_data->
length();
94 PrintF(
"[Serializing to %d bytes took %0.3f ms]\n", length, ms);
117 return data.GetScriptData();
132 instance_type = raw->map()->instance_type();
133 CHECK(!InstanceTypeChecker::IsInstructionStream(instance_type));
136 if (InstanceTypeChecker::IsScript(instance_type)) {
148 script_obj->context_data();
149 if (raw_context_data != roots.undefined_value() &&
150 raw_context_data != roots.uninitialized_symbol()) {
151 script_obj->set_context_data(roots.undefined_value());
157 direct_handle(script_obj->host_defined_options(), isolate());
158 script_obj->set_host_defined_options(roots.empty_fixed_array());
164 script_obj->set_host_defined_options(*host_options);
165 script_obj->set_context_data(*context_data);
168 }
else if (InstanceTypeChecker::IsSharedFunctionInfo(instance_type)) {
171 bool restore_bytecode =
false;
175 DCHECK(!sfi->IsApiFunction());
176#if V8_ENABLE_WEBASSEMBLY
179 DCHECK(!sfi->HasAsmWasmData());
182 if (
auto maybe_debug_info = sfi->TryGetDebugInfo(isolate())) {
183 debug_info =
direct_handle(maybe_debug_info.value(), isolate());
185 if (debug_info->HasInstrumentedBytecodeArray()) {
186 restore_bytecode =
true;
187 sfi->SetActiveBytecodeArray(
188 debug_info->OriginalBytecodeArray(isolate()),
isolate());
191 if (
v8_flags.profile_guided_optimization) {
192 cached_tiering_decision = sfi->cached_tiering_decision();
194 sfi->set_cached_tiering_decision(
202 if (restore_bytecode) {
203 sfi->SetActiveBytecodeArray(debug_info->DebugBytecodeArray(isolate()),
206 if (
v8_flags.profile_guided_optimization &&
208 sfi->set_cached_tiering_decision(cached_tiering_decision);
211 }
else if (InstanceTypeChecker::IsUncompiledDataWithoutPreparseDataWithJob(
220 }
else if (InstanceTypeChecker::IsUncompiledDataWithPreparseDataAndJob(
229 }
else if (InstanceTypeChecker::IsScopeInfo(instance_type)) {
236 bool restore_dependent_code =
false;
237 if (scope_info->SloppyEvalCanExtendVars()) {
243 if (scope_info->dependent_code() != empty_dependent_code) {
245 restore_dependent_code =
true;
246 scope_info->set_dependent_code(empty_dependent_code);
250 if (restore_dependent_code) {
262 IsInterpreterData(*obj)) {
267 CHECK(!InstanceTypeChecker::IsMap(instance_type));
269 CHECK(!InstanceTypeChecker::IsJSGlobalProxy(instance_type) &&
270 !InstanceTypeChecker::IsJSGlobalObject(instance_type));
275 CHECK(!InstanceTypeChecker::IsJSFunction(instance_type) &&
276 !InstanceTypeChecker::IsContext(instance_type));
294void CreateInterpreterDataForDeserializedCode(
296 bool log_code_creation) {
297 DCHECK_IMPLIES(log_code_creation, isolate->NeedsSourcePositions());
303 if (IsString(script->name())) name =
Cast<String>(script->name());
308 !shared_info.
is_null(); shared_info = iter.Next()) {
310 if (!is_compiled.is_compiled())
continue;
311 DCHECK(shared_info->HasBytecodeArray());
319 isolate->factory()->NewInterpreterData(bytecode, code);
321 if (sfi->HasBaselineCode()) {
323 ->set_bytecode_or_interpreter_data(*interpreter_data);
325 sfi->set_interpreter_data(isolate, *interpreter_data);
328 if (!log_code_creation)
continue;
331 Script::PositionInfo
info;
333 int line_num = info.line_start + 1;
334 int column_num = info.line_end + 1;
336 CodeCreateEvent(LogEventListener::CodeTag::kFunction, abstract_code,
337 sfi, name_handle, line_num, column_num));
341class StressOffThreadDeserializeThread final :
public base::Thread {
343 explicit StressOffThreadDeserializeThread(Isolate* isolate,
344 AlignedCachedData* cached_data)
346 base::Thread::Options(
"StressOffThreadDeserializeThread", 2 * MB)),
352 UnparkedScope unparked_scope(&local_isolate);
353 LocalHandleScope handle_scope(&local_isolate);
358 MaybeDirectHandle<SharedFunctionInfo> Finalize(
359 Isolate* isolate, DirectHandle<String> source,
360 const ScriptDetails& script_details) {
362 isolate, std::move(off_thread_data_), cached_data_, source,
372void FinalizeDeserialization(Isolate* isolate,
373 DirectHandle<SharedFunctionInfo>
result,
374 const base::ElapsedTimer& timer,
375 const ScriptDetails& script_details) {
379 "V8.FinalizeDeserialization");
381 const bool log_code_creation = isolate->IsLoggingCodeCreation();
383 if (
V8_UNLIKELY(isolate->interpreted_frames_native_stack())) {
384 CreateInterpreterDataForDeserializedCode(isolate,
result,
395 bool needs_source_positions = isolate->NeedsSourcePositions();
396 if (!log_code_creation && !needs_source_positions)
return;
398 if (needs_source_positions) {
402 DirectHandle<String>
name(IsString(script->name())
404 : ReadOnlyRoots(isolate).empty_string(),
409 FunctionEvent(
"deserialize", script->id(),
410 timer.Elapsed().InMillisecondsF(),
411 result->StartPosition(),
result->EndPosition(), *name));
414 SharedFunctionInfo::ScriptIterator iter(isolate, *script);
416 info = iter.Next()) {
417 if (!info->is_compiled())
continue;
418 DirectHandle<SharedFunctionInfo> shared_info(info, isolate);
419 if (needs_source_positions) {
422 Script::PositionInfo pos_info;
424 int line_num = pos_info.line + 1;
425 int column_num = pos_info.column + 1;
429 shared_info->is_toplevel() ? LogEventListener::CodeTag::kScript
430 : LogEventListener::CodeTag::kFunction,
432 shared_info, name, line_num, column_num));
436#ifdef V8_ENABLE_SPARKPLUG
437void BaselineBatchCompileIfSparkplugCompiled(Isolate* isolate,
443 SharedFunctionInfo::ScriptIterator iter(isolate, script);
445 info = iter.Next()) {
448 isolate->baseline_batch_compiler()->EnqueueSFI(info);
454void BaselineBatchCompileIfSparkplugCompiled(Isolate*,
Tagged<Script>) {}
459 case SerializedCodeSanityCheckResult::kSuccess:
461 case SerializedCodeSanityCheckResult::kMagicNumberMismatch:
462 return "magic number mismatch";
463 case SerializedCodeSanityCheckResult::kVersionMismatch:
464 return "version mismatch";
465 case SerializedCodeSanityCheckResult::kSourceMismatch:
466 return "source mismatch";
467 case SerializedCodeSanityCheckResult::kFlagsMismatch:
468 return "flags mismatch";
469 case SerializedCodeSanityCheckResult::kChecksumMismatch:
470 return "checksum mismatch";
471 case SerializedCodeSanityCheckResult::kInvalidHeader:
472 return "invalid header";
473 case SerializedCodeSanityCheckResult::kLengthMismatch:
474 return "length mismatch";
475 case SerializedCodeSanityCheckResult::kReadOnlySnapshotChecksumMismatch:
476 return "read-only snapshot checksum mismatch";
485 if (
v8_flags.stress_background_compile) {
486 StressOffThreadDeserializeThread thread(isolate, cached_data);
487 CHECK(thread.Start());
489 return thread.Finalize(isolate, source, script_details);
506 SerializedCodeSanityCheckResult::kSuccess;
508 isolate, cached_data,
511 &sanity_check_result);
512 if (sanity_check_result != SerializedCodeSanityCheckResult::kSuccess) {
513 if (
v8_flags.profile_deserialization) {
514 PrintF(
"[Cached code failed check: %s]\n",
ToString(sanity_check_result));
517 isolate->counters()->code_cache_reject_reason()->AddSample(
518 static_cast<int>(sanity_check_result));
529 if (
v8_flags.profile_deserialization)
PrintF(
"[Deserializing failed]\n");
538 maybe_cached_script.
ToHandle(&cached_script)) {
549 script->set_deserialized(
true);
550 BaselineBatchCompileIfSparkplugCompiled(isolate, script);
551 if (
v8_flags.profile_deserialization) {
552 double ms = timer.Elapsed().InMillisecondsF();
553 int length = cached_data->
length();
554 PrintF(
"[Deserializing from %d bytes took %0.3f ms]\n", length, ms);
557 FinalizeDeserialization(isolate,
result, timer, script_details);
564 std::unique_ptr<PersistentHandles> previous_persistent_handles =
565 heap->DetachPersistentHandles();
574 if (previous_persistent_handles) {
575 heap->AttachPersistentHandles(std::move(previous_persistent_handles));
586 DCHECK(!local_isolate->
heap()->HasPersistentHandles());
590 local_isolate, cached_data, &
result.sanity_check_result);
591 if (
result.sanity_check_result != SerializedCodeSanityCheckResult::kSuccess) {
600 local_isolate, &scd, &
result.scripts);
631 data.sanity_check_result;
637 &sanity_check_result);
638 if (sanity_check_result != SerializedCodeSanityCheckResult::kSuccess) {
643 sanity_check_result ==
644 SerializedCodeSanityCheckResult::kSourceMismatch);
648 sanity_check_result ==
649 SerializedCodeSanityCheckResult::kSourceMismatch);
650 if (
v8_flags.profile_deserialization) {
651 PrintF(
"[Cached code failed check: %s]\n",
ToString(sanity_check_result));
654 isolate->counters()->code_cache_reject_reason()->AddSample(
655 static_cast<int>(sanity_check_result));
660 if (!data.maybe_result.ToHandle(&
result)) {
662 if (
v8_flags.profile_deserialization) {
663 PrintF(
"[Off-thread deserializing failed]\n");
669 DCHECK(data.persistent_handles->Contains(
result.location()));
672 if (background_merge_task &&
680 DCHECK(isolate->factory()->script_list()->Contains(
689 DCHECK_EQ(*result_script, *data.scripts[0]);
691 if (!
Cast<String>(result_script->source())->Equals(*source)) {
692 isolate->PushStackTraceAndDie(
693 reinterpret_cast<void*
>(result_script->source().ptr()),
694 reinterpret_cast<void*
>(source->ptr()));
704 script->set_deserialized(
true);
705 BaselineBatchCompileIfSparkplugCompiled(isolate, *script);
706 DCHECK(data.persistent_handles->Contains(script.location()));
710 isolate->heap()->SetRootScriptList(*list);
713 if (
v8_flags.profile_deserialization) {
714 double ms = timer.Elapsed().InMillisecondsF();
715 int length = cached_data->
length();
716 PrintF(
"[Finishing off-thread deserialize from %d bytes took %0.3f ms]\n",
720 FinalizeDeserialization(isolate,
result, timer, script_details);
722 DCHECK(!background_merge_task ||
733 uint32_t size = kHeaderSize +
static_cast<uint32_t
>(payload->size());
740 memset(
data_, 0, kHeaderSize);
745 SetHeaderValue(kSourceHashOffset,
cs->source_hash());
749 cs->isolate()->snapshot_blob()));
750 SetHeaderValue(kPayloadLengthOffset,
static_cast<uint32_t
>(payload->size()));
753 memset(
data_ + kUnalignedHeaderSize, 0, kHeaderSize - kUnalignedHeaderSize);
757 static_cast<size_t>(payload->size()));
764 uint32_t expected_ro_snapshot_checksum,
765 uint32_t expected_source_hash)
const {
767 SanityCheckWithoutSource(expected_ro_snapshot_checksum);
768 if (
result != SerializedCodeSanityCheckResult::kSuccess)
return result;
769 return SanityCheckJustSource(expected_source_hash);
773 uint32_t expected_source_hash)
const {
774 uint32_t
source_hash = GetHeaderValue(kSourceHashOffset);
776 return SerializedCodeSanityCheckResult::kSourceMismatch;
778 return SerializedCodeSanityCheckResult::kSuccess;
782 uint32_t expected_ro_snapshot_checksum)
const {
783 if (
size_ < kHeaderSize) {
784 return SerializedCodeSanityCheckResult::kInvalidHeader;
786 uint32_t magic_number = GetMagicNumber();
787 if (magic_number != kMagicNumber) {
788 return SerializedCodeSanityCheckResult::kMagicNumberMismatch;
790 uint32_t version_hash = GetHeaderValue(kVersionHashOffset);
792 return SerializedCodeSanityCheckResult::kVersionMismatch;
794 uint32_t flags_hash = GetHeaderValue(kFlagHashOffset);
796 return SerializedCodeSanityCheckResult::kFlagsMismatch;
798 uint32_t ro_snapshot_checksum =
800 if (ro_snapshot_checksum != expected_ro_snapshot_checksum) {
801 return SerializedCodeSanityCheckResult::kReadOnlySnapshotChecksumMismatch;
803 uint32_t payload_length = GetHeaderValue(kPayloadLengthOffset);
804 uint32_t max_payload_length =
size_ - kHeaderSize;
805 if (payload_length > max_payload_length) {
806 return SerializedCodeSanityCheckResult::kLengthMismatch;
808 if (
v8_flags.verify_snapshot_checksum) {
810 if (
Checksum(ChecksummedContent()) != checksum) {
811 return SerializedCodeSanityCheckResult::kChecksumMismatch;
814 return SerializedCodeSanityCheckResult::kSuccess;
822 "String length must fit into a LengthField");
823 using HasWrappedArgumentsField = LengthField::Next<bool, 1>;
824 using IsModuleField = HasWrappedArgumentsField::Next<bool, 1>;
827 hash = LengthField::update(hash, source->length());
828 hash = HasWrappedArgumentsField::update(hash, !wrapped_arguments.
is_null());
829 hash = IsModuleField::update(hash, origin_options.
IsModule());
837 result->AcquireDataOwnership();
844 const uint8_t* payload =
data_ + kHeaderSize;
846 int length = GetHeaderValue(kPayloadLengthOffset);
852 :
SerializedData(const_cast<uint8_t*>(data->data()), data->length()) {}
856 uint32_t expected_source_hash,
862 expected_source_hash);
863 if (*rejection_result != SerializedCodeSanityCheckResult::kSuccess) {
878 if (*rejection_result != SerializedCodeSanityCheckResult::kSuccess) {
892 if (*rejection_result != SerializedCodeSanityCheckResult::kSuccess) {
896 SerializedCodeSanityCheckResult::kSourceMismatch);
902 if (*rejection_result != SerializedCodeSanityCheckResult::kSuccess) {
906 SerializedCodeSanityCheckResult::kSourceMismatch);
uint8_t data_[MAX_STACK_LENGTH]
interpreter::Bytecode bytecode
union v8::internal::@341::BuiltinMetadata::KindSpecificData data
void AcquireDataOwnership()
void ReleaseDataOwnership()
const uint8_t * data() const
AlignedCachedData(const uint8_t *data, int length)
bool HasPendingBackgroundWork() const
void SetUpOnMainThread(Isolate *isolate, Handle< String > source_text, const ScriptDetails &script_details, LanguageMode language_mode)
bool HasPendingForegroundWork() const
void BeginMergeInBackground(LocalIsolate *isolate, DirectHandle< Script > new_script)
Handle< SharedFunctionInfo > CompleteMergeInForeground(Isolate *isolate, DirectHandle< Script > new_script)
static DirectHandle< Code > CreateInterpreterEntryTrampolineForProfiling(Isolate *isolate)
static V8_WARN_UNUSED_RESULT MaybeDirectHandle< SharedFunctionInfo > FinishOffThreadDeserialize(Isolate *isolate, OffThreadDeserializeData &&data, AlignedCachedData *cached_data, DirectHandle< String > source, const ScriptDetails &script_details, BackgroundMergeTask *background_merge_task=nullptr)
void SerializeGeneric(Handle< HeapObject > heap_object, SlotType slot_type)
void SerializeObjectImpl(Handle< HeapObject > o, SlotType slot_type) override
static V8_EXPORT_PRIVATE ScriptCompiler::CachedData * Serialize(Isolate *isolate, Handle< SharedFunctionInfo > info)
CodeSerializer(const CodeSerializer &)=delete
AlignedCachedData * SerializeSharedFunctionInfo(Handle< SharedFunctionInfo > info)
uint32_t source_hash() const
static V8_WARN_UNUSED_RESULT OffThreadDeserializeData StartDeserializeOffThread(LocalIsolate *isolate, AlignedCachedData *cached_data)
static V8_WARN_UNUSED_RESULT MaybeDirectHandle< SharedFunctionInfo > Deserialize(Isolate *isolate, AlignedCachedData *cached_data, DirectHandle< String > source, const ScriptDetails &script_details, MaybeDirectHandle< Script > maybe_cached_script={})
static V8_EXPORT_PRIVATE Tagged< DependentCode > empty_dependent_code(const ReadOnlyRoots &roots)
V8_INLINE bool is_null() const
HandleType< T > CloseAndEscape(HandleType< T > handle_value)
std::unique_ptr< PersistentHandles > DetachPersistentHandles()
MaybeIndirectHandle< T > NewPersistentMaybeHandle(MaybeHandleType< T > maybe_handle)
const v8::StartupData * snapshot_blob() const
V8_WARN_UNUSED_RESULT V8_INLINE bool ToHandle(DirectHandle< S > *out) const
static MaybeObjectDirectHandle Weak(Tagged< Object > object, Isolate *isolate)
static MaybeDirectHandle< SharedFunctionInfo > DeserializeSharedFunctionInfo(Isolate *isolate, const SerializedCodeData *data, DirectHandle< String > source)
static V8_EXPORT_PRIVATE bool StrictEquals(Tagged< Object > obj, Tagged< Object > that)
static MaybeDirectHandle< SharedFunctionInfo > DeserializeSharedFunctionInfo(LocalIsolate *isolate, const SerializedCodeData *data, std::vector< IndirectHandle< Script > > *deserialized_scripts)
virtual void VisitRootPointer(Root root, const char *description, FullObjectSlot p)
static void InitLineEnds(Isolate *isolate, DirectHandle< Script > script)
static void SetSource(Isolate *isolate, DirectHandle< Script > script, DirectHandle< String > source)
static bool GetPositionInfo(DirectHandle< Script > script, int position, PositionInfo *info, OffsetFlag offset_flag=OffsetFlag::kWithOffset)
static SerializedCodeData FromPartiallySanityCheckedCachedData(AlignedCachedData *cached_data, uint32_t expected_source_hash, SerializedCodeSanityCheckResult *rejection_result)
AlignedCachedData * GetScriptData()
SerializedCodeSanityCheckResult SanityCheckJustSource(uint32_t expected_source_hash) const
SerializedCodeSanityCheckResult SanityCheckWithoutSource(uint32_t expected_ro_snapshot_checksum) const
base::Vector< const uint8_t > Payload() const
static SerializedCodeData FromCachedData(Isolate *isolate, AlignedCachedData *cached_data, uint32_t expected_source_hash, SerializedCodeSanityCheckResult *rejection_result)
static SerializedCodeData FromCachedDataWithoutSource(LocalIsolate *local_isolate, AlignedCachedData *cached_data, SerializedCodeSanityCheckResult *rejection_result)
static uint32_t SourceHash(DirectHandle< String > source, DirectHandle< FixedArray > wrapped_arguments, ScriptOriginOptions origin_options)
SerializedCodeSanityCheckResult SanityCheck(uint32_t expected_ro_snapshot_checksum, uint32_t expected_source_hash) const
SerializedCodeData(const std::vector< uint8_t > *payload, const CodeSerializer *cs)
void Serialize(SlotType slot_type)
PtrComprCageBase cage_base() const
Isolate * isolate() const
void SerializeDeferredObjects()
bool SerializeRoot(Tagged< HeapObject > obj)
bool SerializeReadOnlyObjectReference(Tagged< HeapObject > obj, SnapshotByteSink *sink)
void Pad(int padding_offset=0)
bool SerializeHotObject(Tagged< HeapObject > obj)
bool SerializeBackReference(Tagged< HeapObject > obj)
static void EnsureSourcePositionsAvailable(Isolate *isolate, DirectHandle< SharedFunctionInfo > shared_info)
const std::vector< uint8_t > * data() const
static V8_EXPORT_PRIVATE uint32_t ExtractReadOnlySnapshotChecksum(const v8::StartupData *data)
static const uint32_t kMaxLength
V8_INLINE constexpr bool is_null() const
NEVER_READ_ONLY_SPACE static V8_EXPORT_PRIVATE Handle< WeakArrayList > AddToEnd(Isolate *isolate, Handle< WeakArrayList > array, MaybeObjectDirectHandle value)
#define PROFILE(the_isolate, Call)
AlignedCachedData * cached_data_
CodeSerializer::OffThreadDeserializeData off_thread_data_
Handle< SharedFunctionInfo > info
ZoneVector< RpoNumber > & result
#define LOG(isolate, Call)
InstructionOperand source
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
constexpr intptr_t kPointerAlignment
void CopyBytes(T *dst, const T *src, size_t num_bytes)
constexpr const char * ToString(DeoptimizeKind kind)
v8::ScriptCompiler::CachedData::CompatibilityCheckResult SerializedCodeSanityCheckResult
PerThreadAssertScopeDebugOnly< false, SAFEPOINTS_ASSERT, HEAP_ALLOCATION_ASSERT > DisallowGarbageCollection
void PrintF(const char *format,...)
Tagged(T object) -> Tagged< T >
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 SetScriptFieldsFromDetails(Isolate *isolate, Tagged< Script > script, const ScriptDetails &script_details, DisallowGarbageCollection *no_gc)
void ShortPrint(Tagged< Object > obj, FILE *out)
Tagged< MaybeWeak< T > > MakeWeak(Tagged< T > value)
V8_EXPORT_PRIVATE FlagValues v8_flags
static constexpr Address kNullAddress
T * NewArray(size_t size)
bool CanCompileWithBaseline(Isolate *isolate, Tagged< SharedFunctionInfo > shared)
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)
static constexpr AcquireLoadTag kAcquireLoad
static const uint32_t kReadOnlySnapshotChecksumOffset
static const uint32_t kChecksumOffset
#define CHECK_IMPLIES(lhs, rhs)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK_NE(v1, v2)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
constexpr bool IsAligned(T value, U alignment)
std::vector< IndirectHandle< Script > > scripts
MaybeIndirectHandle< SharedFunctionInfo > maybe_result
std::unique_ptr< PersistentHandles > persistent_handles
DirectHandle< Script > GetOnlyScript(LocalHeap *heap)
const ScriptOriginOptions origin_options
MaybeHandle< FixedArray > wrapped_arguments
#define TRACE_EVENT0(category_group, name)
#define TRACE_DISABLED_BY_DEFAULT(name)
#define TRACE_EVENT_CALL_STATS_SCOPED(isolate, category_group, name)
#define V8_UNLIKELY(condition)