36#ifdef V8_ENABLE_MAGLEV
48#ifdef V8_ENABLE_MAGLEV
52#if V8_ENABLE_WEBASSEMBLY
65 return ReadOnlyRoots(isolate).undefined_value();
77 PrintF(
"Error: Function ");
80 " should be prepared for optimization with "
81 "%%PrepareFunctionForOptimization before "
82 "%%OptimizeFunctionOnNextCall / %%OptimizeMaglevOnNextCall / "
93 return v8_flags.correctness_fuzzer_suppressions
94 ? ReadOnlyRoots(isolate).undefined_value()
101#define CONVERT_INT32_ARG_FUZZ_SAFE(name, index) \
102 if (!IsNumber(args[index])) return CrashUnlessFuzzing(isolate); \
104 if (!Object::ToInt32(args[index], &name)) return CrashUnlessFuzzing(isolate);
109#define CONVERT_BOOLEAN_ARG_FUZZ_SAFE(name, index) \
110 if (!IsBoolean(args[index])) return CrashUnlessFuzzing(isolate); \
111 bool name = IsTrue(args[index], isolate);
115#if V8_ENABLE_WEBASSEMBLY
118 return function->shared()->HasAsmWasmData() ||
119 function->code(isolate)->builtin_id() == Builtin::kInstantiateAsmJs;
129 isolate->load_stub_cache()->Clear();
130 isolate->store_stub_cache()->Clear();
131 isolate->define_own_stub_cache()->Clear();
141 uint64_t
result = (
static_cast<uint64_t
>(
hi) << 32) |
lo;
149 return isolate->heap()->ToBoolean(s->IsFlat());
159 const bool is_one_byte =
160 left->IsOneByteRepresentation() && right->IsOneByteRepresentation();
161 const int length = left->length() + right->length();
162 return *isolate->factory()->NewConsString(left, right, length, is_one_byte);
170 int index =
args.smi_value_at(1);
175 isolate->factory()->NewSubString(
string, index, string->length());
176 CHECK(IsSlicedString(*sliced_string));
177 return *sliced_string;
185 CHECK(string->IsOneByteRepresentation());
187 isolate->factory()->InternalizeString(
string);
188 CHECK(IsInternalizedString(*
string));
189 return *internalized;
197 if (!IsConsString(*
string)) {
198 string = isolate->factory()->NewConsString(
199 isolate->factory()->empty_string(),
string, string->length(),
200 string->IsOneByteRepresentation(),
204 CHECK(IsConsString(*
string));
206 isolate->factory()->InternalizeString(
string);
208 CHECK(IsThinString(*
string));
214 if (
args.length() != 1) {
215 return CrashUnlessFuzzing(isolate);
219 if (!IsJSFunction(*function_object))
return CrashUnlessFuzzing(isolate);
222 if (function->IsTieringRequestedOrInProgress()) {
223 if (function->tiering_in_progress()) {
228 function->ResetTieringRequests();
231 if (function->HasAttachedOptimizedCode(isolate)) {
245 if (!it.done()) function =
direct_handle(it.frame()->function(), isolate);
246 if (function.is_null())
return CrashUnlessFuzzing(isolate);
248 if (function->HasAttachedOptimizedCode(isolate)) {
266#if defined(USE_SIMULATOR)
275 if (
args.length() != 1 || !IsString(
args[0])) {
276 return CrashUnlessFuzzing(isolate);
291 return isolate->heap()->ToBoolean(
v8_flags.use_ic);
296 return isolate->heap()->ToBoolean(
297 isolate->concurrent_recompilation_enabled());
302 return isolate->heap()->ToBoolean(isolate->allow_atomics_wait());
307bool CanOptimizeFunction(
CodeKind target_kind,
308 DirectHandle<JSFunction> function,
Isolate* isolate,
309 IsCompiledScope* is_compiled_scope) {
314 if (!is_compiled_scope->is_compiled() &&
316 is_compiled_scope)) {
317 return CrashUnlessFuzzingReturnFalse(isolate);
320 if (target_kind == CodeKind::TURBOFAN_JS && !
v8_flags.turbofan)
return false;
325 if (function->shared()->optimization_disabled() &&
326 function->shared()->disabled_optimization_reason() ==
327 BailoutReason::kNeverOptimize) {
328 return CrashUnlessFuzzingReturnFalse(isolate);
331 if (IsAsmWasmFunction(isolate, *function)) {
332 return CrashUnlessFuzzingReturnFalse(isolate);
335 if (
v8_flags.testing_d8_test_runner) {
336 if (!CheckMarkedForManualOptimization(isolate, *function)) {
337 return CrashUnlessFuzzingReturnFalse(isolate);
341 if (function->is_compiled(isolate) &&
342 !function->HasAvailableCodeKind(isolate,
343 CodeKind::INTERPRETED_FUNCTION)) {
344 return CrashUnlessFuzzingReturnFalse(isolate);
347 if (function->HasAvailableCodeKind(isolate, target_kind) ||
348 function->HasAvailableHigherTierCodeThan(isolate, target_kind)) {
349 DCHECK(function->HasAttachedOptimizedCode(isolate) ||
350 function->ChecksTieringState(isolate));
360 if (
args.length() != 1 &&
args.length() != 2) {
361 return CrashUnlessFuzzing(isolate);
364 DirectHandle<Object> function_object =
args.at(0);
365 if (!IsJSFunction(*function_object))
return CrashUnlessFuzzing(isolate);
368 IsCompiledScope is_compiled_scope(
369 function->shared()->is_compiled_scope(isolate));
370 if (!CanOptimizeFunction(target_kind, function, isolate,
371 &is_compiled_scope)) {
372 return ReadOnlyRoots(isolate).undefined_value();
376 if (
args.length() == 2) {
377 DirectHandle<Object> type =
args.at(1);
378 if (!IsString(*type))
return CrashUnlessFuzzing(isolate);
381 isolate->concurrent_recompilation_enabled()) {
388 if (!function->is_compiled(isolate)) {
389 DCHECK(function->shared()->HasBytecodeArray());
391 if (function->shared()->HasBaselineCode()) {
394 function->UpdateCode(code);
399 if (function->GetActiveTier(isolate) != target_kind) {
400 function->RequestOptimization(isolate, target_kind, concurrency_mode);
403 return ReadOnlyRoots(isolate).undefined_value();
406bool EnsureCompiledAndFeedbackVector(Isolate* isolate,
407 DirectHandle<JSFunction> function,
408 IsCompiledScope* is_compiled_scope) {
410 function->shared()->is_compiled_scope(function->GetIsolate());
413 if (!is_compiled_scope->is_compiled()) {
415 DCHECK(function->shared()->allows_lazy_compilation());
417 is_compiled_scope)) {
424 if (!function->shared()->HasFeedbackMetadata()) {
435 if (
args.length() != 1) {
436 return CrashUnlessFuzzing(isolate);
439 if (!IsJSFunction(*function_object))
return CrashUnlessFuzzing(isolate);
443 function->shared(isolate)->is_compiled_scope(isolate);
445 if (!function->shared(isolate)->IsUserJavaScript()) {
446 return CrashUnlessFuzzing(isolate);
452 &is_compiled_scope)) {
453 return CrashUnlessFuzzing(isolate);
457 &is_compiled_scope)) {
458 return CrashUnlessFuzzing(isolate);
467#ifdef V8_ENABLE_MAGLEV
472 int count =
args.smi_value_at(1);
474 DirectHandle<Code>
code;
483 PrintF(
"Maglev compile time: %g ms!\n",
484 timer.Elapsed().InMillisecondsF() / count);
486 function->UpdateOptimizedCode(isolate, *code);
488 return ReadOnlyRoots(isolate).undefined_value();
492 PrintF(
"Maglev is not enabled.\n");
506 CodeKind::TURBOFAN_JS);
509 CodeKind::TURBOFAN_JS);
512 double compile_time = timer.Elapsed().InMillisecondsF() /
count;
514 return *isolate->factory()->NewNumber(compile_time);
519 if (
args.length() != 1 || !IsJSFunction(
args[0])) {
520 return CrashUnlessFuzzing(isolate);
523 return isolate->heap()->ToBoolean(function->ActiveTierIsIgnition(isolate));
528 if (
args.length() != 1 || !IsJSFunction(
args[0])) {
529 return CrashUnlessFuzzing(isolate);
532 return isolate->heap()->ToBoolean(function->ActiveTierIsBaseline(isolate));
537 if (
args.length() != 1 || !IsJSFunction(
args[0])) {
538 return CrashUnlessFuzzing(isolate);
541 return isolate->heap()->ToBoolean(function->ActiveTierIsMaglev(isolate));
546 if (
args.length() != 1 || !IsJSFunction(
args[0])) {
547 return CrashUnlessFuzzing(isolate);
550 return isolate->heap()->ToBoolean(function->ActiveTierIsTurbofan(isolate));
554 return isolate->heap()->ToBoolean(
v8_flags.sparkplug);
562 return isolate->heap()->ToBoolean(
v8_flags.turbofan);
568 return isolate->heap()->ToBoolean(it.frame()->is_turbofan());
571#ifdef V8_ENABLE_MAGLEV
574 return OptimizeFunctionOnNextCall(
576 v8_flags.optimize_maglev_optimizes_to_turbofan ? CodeKind::TURBOFAN_JS
589 return OptimizeFunctionOnNextCall(
591 v8_flags.optimize_on_next_call_optimizes_to_maglev
593 : CodeKind::TURBOFAN_JS);
598 if (
args.length() != 1 || !IsJSFunction(
args[0])) {
599 return CrashUnlessFuzzing(isolate);
602 if (function->has_feedback_vector()) {
607 EnsureCompiledAndFeedbackVector(isolate, function, &is_compiled_scope);
613 if ((
args.length() != 1 &&
args.length() != 2) || !IsJSFunction(
args[0])) {
614 return CrashUnlessFuzzing(isolate);
619 if (!EnsureCompiledAndFeedbackVector(isolate, function, &is_compiled_scope)) {
620 return CrashUnlessFuzzing(isolate);
625 if (function->shared()->optimization_disabled() &&
626 function->shared()->disabled_optimization_reason() ==
627 BailoutReason::kNeverOptimize) {
628 return CrashUnlessFuzzing(isolate);
631 if (IsAsmWasmFunction(isolate, *function))
return CrashUnlessFuzzing(isolate);
637 isolate, function, &is_compiled_scope);
645void FinalizeOptimization(
Isolate* isolate) {
646 DCHECK(isolate->concurrent_recompilation_enabled());
647 isolate->optimizing_compile_dispatcher()->WaitUntilCompilationJobsDone();
648 isolate->optimizing_compile_dispatcher()->InstallOptimizedFunctions();
649 isolate->optimizing_compile_dispatcher()->set_finalize(
true);
652 if (isolate->maglev_concurrent_dispatcher()->is_enabled()) {
653 isolate->maglev_concurrent_dispatcher()->AwaitCompileJobs();
654 isolate->maglev_concurrent_dispatcher()->FinalizeFinishedJobs();
659BytecodeOffset OffsetOfNextJumpLoop(Isolate* isolate,
661 int current_offset) {
662 interpreter::BytecodeArrayIterator it(bytecode_array, current_offset);
665 for (; !it.done(); it.Advance()) {
666 if (it.current_bytecode() != interpreter::Bytecode::kJumpLoop) {
670 it.current_offset())) {
674 return BytecodeOffset(it.current_offset());
678 it.SetOffset(current_offset);
679 for (; !it.done(); it.Advance()) {
680 if (it.current_bytecode() == interpreter::Bytecode::kJumpLoop) {
681 return BytecodeOffset(it.current_offset());
697 if (
args.length() == 1) {
698 if (!
IsSmi(
args[0]))
return CrashUnlessFuzzing(isolate);
699 stack_depth =
args.smi_value_at(0);
704 while (!it.done() && stack_depth--) it.Advance();
706 if (it.frame()->is_turbofan()) {
710 "[OSR - %%OptimizeOsr failed because the current function could "
715 }
else if (it.frame()->is_maglev()) {
721 if (function.is_null())
return CrashUnlessFuzzing(isolate);
728 if (!function->shared()->allows_lazy_compilation()) {
729 return CrashUnlessFuzzing(isolate);
732 if (function->shared()->optimization_disabled() &&
733 function->shared()->disabled_optimization_reason() ==
734 BailoutReason::kNeverOptimize) {
735 return CrashUnlessFuzzing(isolate);
738 if (
v8_flags.testing_d8_test_runner) {
739 if (!CheckMarkedForManualOptimization(isolate, *function)) {
740 return CrashUnlessFuzzing(isolate);
744 if (function->HasAvailableOptimizedCode(isolate) &&
745 (!function->code(isolate)->is_maglevved() || !
v8_flags.osr_from_maglev)) {
746 DCHECK(function->HasAttachedOptimizedCode(isolate) ||
747 function->ChecksTieringState(isolate));
752 if (!it.frame()->is_unoptimized() &&
753 (!it.frame()->is_maglev() || !
v8_flags.osr_from_maglev)) {
759 function->shared()->is_compiled_scope(isolate));
761 isolate->tiering_manager()->RequestOsrAtNextOpportunity(*function);
776 bool concurrent_osr =
777 isolate->concurrent_recompilation_enabled() &&
v8_flags.concurrent_osr;
778 bool is_maglev =
false;
779 if (it.frame()->is_maglev() || concurrent_osr) {
781 if (it.frame()->is_unoptimized()) {
786 OffsetOfNextJumpLoop(isolate, bytecode_array, current_offset);
790 function->shared()->GetBytecodeArray(isolate), isolate);
792 osr_offset = OffsetOfNextJumpLoop(
793 isolate, bytecode_array,
794 current_offset.
IsNone() ? 0 : current_offset.
ToInt());
798 if (osr_offset.
IsNone()) {
807 if (concurrent_osr) {
808 FinalizeOptimization(isolate);
813 isolate, function, osr_offset,
818 : CodeKind::TURBOFAN_JS);
824 if (concurrent_osr) {
825 FinalizeOptimization(isolate);
831 function->feedback_vector()->set_osr_urgency(
845 if (function.is_null())
return CrashUnlessFuzzing(isolate);
849 if (!it.frame()->is_unoptimized()) {
854 function->shared()->is_compiled_scope(isolate));
863 if (
args.length() != 1) {
864 return CrashUnlessFuzzing(isolate);
868 if (!IsJSFunction(*function_object, cage_base)) {
869 return CrashUnlessFuzzing(isolate);
873 CodeKind code_kind = sfi->abstract_code(isolate)->kind(cage_base);
875 case CodeKind::INTERPRETED_FUNCTION:
877 case CodeKind::BUILTIN:
881 return CrashUnlessFuzzing(isolate);
885 return CrashUnlessFuzzing(isolate);
891 if (isolate->lazy_compile_dispatcher() &&
892 isolate->lazy_compile_dispatcher()->IsEnqueued(sfi)) {
893 isolate->lazy_compile_dispatcher()->FinishNow(sfi);
896 sfi->DisableOptimization(isolate, BailoutReason::kNeverOptimize);
910 if (!isolate->use_optimizer()) {
919 if (
v8_flags.optimize_on_next_call_optimizes_to_maglev) {
920 status |=
static_cast<int>(
923 if (
v8_flags.optimize_maglev_optimizes_to_turbofan) {
924 status |=
static_cast<int>(
929 if (IsUndefined(*function_object))
return Smi::FromInt(status);
930 if (!IsJSFunction(*function_object))
return CrashUnlessFuzzing(isolate);
935 if (function->has_feedback_vector()) {
936 if (function->tiering_in_progress()) {
938 }
else if (function->GetRequestedOptimizationIfAny(
940 status |=
static_cast<int>(
942 }
else if (function->GetRequestedOptimizationIfAny(
947 }
else if (function->GetRequestedOptimizationIfAny(
949 CodeKind::TURBOFAN_JS) {
950 status |=
static_cast<int>(
952 }
else if (function->GetRequestedOptimizationIfAny(
954 CodeKind::TURBOFAN_JS) {
959 if (function->HasAttachedOptimizedCode(isolate)) {
961 if (code->marked_for_deoptimization()) {
966 if (code->is_maglevved()) {
968 }
else if (code->is_turbofanned()) {
972 if (function->HasAttachedCodeKind(isolate, CodeKind::BASELINE)) {
975 if (function->ActiveTierIsIgnition(isolate)) {
978 if (!function->is_compiled(isolate)) {
987 if (it.frame()->function() == *function) {
993 if (frame !=
nullptr) {
1018 return it.frame()->function();
1022 if (isolate->concurrent_recompilation_enabled()) {
1023 isolate->optimizing_compile_dispatcher()->WaitUntilCompilationJobsDone();
1024 isolate->optimizing_compile_dispatcher()->InstallOptimizedFunctions();
1025 isolate->stack_guard()->ClearInstallCode();
1026 isolate->optimizing_compile_dispatcher()->set_finalize(
false);
1032 if (isolate->concurrent_recompilation_enabled()) {
1033 isolate->optimizing_compile_dispatcher()->WaitUntilCompilationJobsDone();
1035 if (isolate->maglev_concurrent_dispatcher()->is_enabled()) {
1036 isolate->maglev_concurrent_dispatcher()->AwaitCompileJobs();
1044 if (isolate->concurrent_recompilation_enabled()) {
1045 FinalizeOptimization(isolate);
1052 if (
args.length() != 1)
return CrashUnlessFuzzing(isolate);
1055 if (!IsJSFunction(*function_object))
return CrashUnlessFuzzing(isolate);
1060 if (!sfi->CanDiscardCompiled()) {
1061 return CrashUnlessFuzzing(isolate);
1066 frame_it.Advance()) {
1067 std::vector<Tagged<SharedFunctionInfo>> infos;
1068 frame_it.frame()->GetFunctions(&infos);
1069 for (
auto infos_it = infos.rbegin(); infos_it != infos.rend(); ++infos_it) {
1070 if ((*infos_it) == sfi)
return CrashUnlessFuzzing(isolate);
1075 function->ResetIfCodeFlushed(isolate);
1081 info.GetReturnValue().SetNull();
1088 desc->MarkAsUndetectable();
1101 auto global = context->Global();
1102 auto target_function_name = info.Data().As<
v8::String>();
1106 if (!global->Get(context, target_function_name).ToLocal(&
result)) {
1109 if (!
result->IsFunction()) {
1110 isolate->ThrowError(
"Target function is not callable");
1113 target =
result.As<Function>();
1115 int argc = info.Length();
1117 for (
int i = 0;
i < argc;
i++) {
1121 if (!target->Call(context, info.This(), argc,
args.data()).ToLocal(&
result)) {
1124 info.GetReturnValue().Set(
result);
1134 isolate->native_context()->abstract_module_source_function();
1135 CHECK(IsJSFunction(*abstract_module_source_function));
1136 return abstract_module_source_function;
1143 if (
args.length() != 1) {
1144 return CrashUnlessFuzzing(isolate);
1150 instance_template->SetCallAsFunctionHandler(
1151 call_as_function, v8::Utils::ToLocal(target_function_name));
1152 v8_isolate->GetCurrentContext();
1154 t->GetFunction(v8_isolate->GetCurrentContext())
1156 ->NewInstance(v8_isolate->GetCurrentContext())
1169 function->ResetTieringRequests();
1175 isolate->heap()->NotifyContextDisposed(
true);
1181 if (
args.length() != 2 &&
args.length() != 3) {
1182 return CrashUnlessFuzzing(isolate);
1184#ifdef V8_ENABLE_ALLOCATION_TIMEOUT
1186 HeapAllocator::SetAllocationGcInterval(interval);
1188 isolate->heap()->set_allocation_timeout(timeout);
1191 if (
args.length() == 3) {
1194 if (inline_allocation) {
1195 isolate->heap()->EnableInlineAllocation();
1197 isolate->heap()->DisableInlineAllocation();
1206int FixedArrayLenFromSize(
int size) {
1211void FillUpOneNewSpacePage(Isolate* isolate, Heap*
heap,
1212 SemiSpaceNewSpace* space) {
1214 heap->FreeMainThreadLinearAllocationAreas();
1215 PauseAllocationObserversScope pause_observers(
heap);
1216 while (space->GetSpaceRemainingOnCurrentPageForTesting() > 0) {
1217 int space_remaining = space->GetSpaceRemainingOnCurrentPageForTesting();
1218 int length = FixedArrayLenFromSize(space_remaining);
1220 DirectHandle<FixedArray> padding =
1222 DCHECK(
heap->new_space()->Contains(*padding));
1223 space_remaining -= padding->Size();
1226 space->FillCurrentPageForTesting();
1228 heap->FreeMainThreadLinearAllocationAreas();
1237 heap->FreeMainThreadLinearAllocationAreas();
1240 if (
heap->minor_sweeping_in_progress()) {
1241 heap->EnsureYoungSweepingCompleted();
1243 auto* space =
heap->paged_new_space()->paged_space();
1244 space->AllocatePageUpToCapacityForTesting();
1245 space->ResetFreeList();
1249 FillUpOneNewSpacePage(isolate,
heap, space);
1250 }
while (space->AddFreshPage());
1257 isolate->RequestInterrupt(
1259 isolate->RequestGarbageCollectionForTesting(
1272 std::string
filename =
"heap.heapsnapshot";
1274 if (
args.length() >= 1) {
1277 std::unique_ptr<char[]> buffer = filename_as_js_string->ToCString();
1278 filename = std::string(buffer.get());
1293 os <<
"[weak cleared]";
1296 bool weak = maybe_object.
IsWeak();
1299 os <<
"DebugPrint: ";
1300 if (weak) os <<
"[weak] ";
1306 if (weak) os <<
"[weak] ";
1308 os <<
Brief(
object);
1317 if (
args.length() == 0) {
1324 std::unique_ptr<std::ostream> output_stream(
new StdoutStream());
1325 if (
args.length() >= 2) {
1329 if (output_int == fileno(stderr)) {
1343 if (
args.length() != 1) {
1344 return CrashUnlessFuzzing(isolate);
1361 static constexpr int kNum16BitChunks = 4;
1365 if (
args.length() != kNum16BitChunks + 1) {
1366 return CrashUnlessFuzzing(isolate);
1370 for (
int i = 0;
i < kNum16BitChunks; ++
i) {
1381 os <<
"0x" << std::hex << value << std::dec << std::endl;
1384 os <<
"0x" << std::hex << value << std::dec << std::endl;
1390 static constexpr int kNum16BitChunks = 4;
1394 if (
args.length() != kNum16BitChunks + 1) {
1395 return CrashUnlessFuzzing(isolate);
1399 for (
int i = 0;
i < kNum16BitChunks; ++
i) {
1410 std::streamsize
precision = os.precision();
1411 os << std::setprecision(20) << base::bit_cast<double>(value) << std::endl;
1415 std::streamsize
precision = os.precision();
1416 os << std::setprecision(20) << base::bit_cast<double>(value) << std::endl;
1424 if (
args.length() != 2) {
1425 return CrashUnlessFuzzing(isolate);
1428 if (!IsString(
args[0]))
return CrashUnlessFuzzing(isolate);
1446 isolate->PrintStack(stdout);
1456 FILE* output_stream = stdout;
1457 if (
args.length() >= 2) {
1461 if (output_int == fileno(stderr)) {
1462 output_stream = stderr;
1467 if (!IsString(
args[0])) {
1477 fflush(output_stream);
1491 if (
args.length() != 1) {
1492 return CrashUnlessFuzzing(isolate);
1495 if (IsTrue(arg, isolate)) {
1496 isolate->set_force_slow_path(
true);
1502 isolate->set_force_slow_path(
false);
1509 if (
args.length() != 1) {
1510 return CrashUnlessFuzzing(isolate);
1512 int message_id =
args.smi_value_at(0);
1514 base::OS::PrintError(
"abort: %s\n", message);
1515 isolate->PrintStack(stderr);
1522 if (
args.length() != 1) {
1523 return CrashUnlessFuzzing(isolate);
1527 base::OS::PrintError(
"[disabled] abort: %s\n", message->ToCString().get());
1530 base::OS::PrintError(
"abort: %s\n", message->ToCString().get());
1531 isolate->PrintStack(stderr);
1538 if (
args.length() != 1) {
1539 return CrashUnlessFuzzing(isolate);
1543 base::OS::PrintError(
1544 "Safely terminating process due to CSA check failure\n");
1548 base::OS::PrintError(
"The following harmless failure was encountered: %s\n",
1549 message->ToCString().get());
1551 base::OS::PrintError(
"abort: CSA_DCHECK failed: %s\n",
1552 message->ToCString().get());
1553 isolate->PrintStack(stderr);
1562 if (
args.length() != 1) {
1563 return CrashUnlessFuzzing(isolate);
1568#ifndef V8_ENABLE_LEAPTIERING
1569 if (!func->is_compiled(isolate) && func->HasAvailableOptimizedCode(isolate)) {
1570 func->UpdateOptimizedCode(isolate,
1571 func->feedback_vector()->optimized_code(isolate));
1574 CHECK(func->shared()->is_compiled() ||
1576 &is_compiled_scope));
1578 Print(func->code(isolate), os);
1586int StackSize(
Isolate* isolate) {
1588 for (JavaScriptStackFrameIterator it(isolate); !it.done(); it.Advance()) n++;
1592void PrintIndentation(
int stack_size) {
1593 const int max_display = 80;
1594 if (stack_size <= max_display) {
1595 PrintF(
"%4d:%*s", stack_size, stack_size,
"");
1597 PrintF(
"%4d:%*s", stack_size, max_display,
"...");
1605 PrintIndentation(StackSize(isolate));
1613 if (
args.length() != 1) {
1614 return CrashUnlessFuzzing(isolate);
1617 PrintIndentation(StackSize(isolate));
1626 if (
args.length() != 2) {
1627 return CrashUnlessFuzzing(isolate);
1630 return CrashUnlessFuzzing(isolate);
1634 return isolate->heap()->ToBoolean(obj1->map() == obj2->map());
1640 return CrashUnlessFuzzing(isolate);
1643 return isolate->heap()->ToBoolean(
1644 isolate->heap()->new_lo_space()->Contains(obj) ||
1645 isolate->heap()->code_lo_space()->Contains(obj) ||
1646 isolate->heap()->lo_space()->Contains(obj));
1651 if (
args.length() != 1 || !IsJSArray(
args[0])) {
1652 return CrashUnlessFuzzing(isolate);
1656 return isolate->heap()->ToBoolean(
1657 isolate->heap()->new_lo_space()->Contains(elements) ||
1658 isolate->heap()->lo_space()->Contains(elements));
1663 if (
args.length() != 1 || !IsJSArray(
args[0])) {
1664 return CrashUnlessFuzzing(isolate);
1668 return isolate->heap()->ToBoolean(elements->IsCowArray());
1673 if (
args.length() != 1) {
1674 return CrashUnlessFuzzing(isolate);
1684 if (
args.length() != 1)
return CrashUnlessFuzzing(isolate);
1686 if (!IsJSObject(arg))
return CrashUnlessFuzzing(isolate);
1692 return ReturnFuzzSafe(
ReadOnlyRoots(isolate).false_value(), isolate);
1699 return ReturnFuzzSafe(
ReadOnlyRoots(isolate).false_value(), isolate);
1702 return ReturnFuzzSafe(
ReadOnlyRoots(isolate).true_value(), isolate);
1709 bool is_code_kind) {
1717 if (
args.length() != 1) {
1718 return CrashUnlessFuzzing(isolate);
1723 flag ? DisallowCodegenFromStringsCallback :
nullptr);
1729 if (
args.length() != 2 || !IsJSRegExp(
args[0]) || !IsBoolean(
args[1])) {
1730 return CrashUnlessFuzzing(isolate);
1733 bool is_latin1 =
args.at<
Boolean>(1)->ToBool(isolate);
1735 if (regexp->has_data()) {
1741 return isolate->heap()->ToBoolean(
result);
1746 if (
args.length() != 2 || !IsJSRegExp(
args[0]) || !IsBoolean(
args[1])) {
1747 return CrashUnlessFuzzing(isolate);
1750 bool is_latin1 =
args.at<
Boolean>(1)->ToBool(isolate);
1752 if (regexp->has_data()) {
1758 return isolate->heap()->ToBoolean(
result);
1763 if (
args.length() != 1 || !IsJSRegExp(
args[0])) {
1764 return CrashUnlessFuzzing(isolate);
1767 const char* type_str;
1768 if (regexp->has_data()) {
1769 switch (regexp->data(isolate)->type_tag()) {
1774 type_str =
"IRREGEXP";
1777 type_str =
"EXPERIMENTAL";
1783 type_str =
"NOT_COMPILED";
1785 return *isolate->factory()->NewStringFromAsciiChecked(type_str);
1790 if (
args.length() != 1 || !IsJSRegExp(
args[0])) {
1791 return CrashUnlessFuzzing(isolate);
1794 return isolate->heap()->ToBoolean(
1798#define ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(Name) \
1799 RUNTIME_FUNCTION(Runtime_##Name) { \
1800 if (args.length() != 1 || !IsJSObject(args[0])) { \
1801 return CrashUnlessFuzzing(isolate); \
1803 auto obj = args.at<JSObject>(0); \
1804 return isolate->heap()->ToBoolean(obj->Name()); \
1819#undef ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION
1821#define FIXED_TYPED_ARRAYS_CHECK_RUNTIME_FUNCTION(Type, type, TYPE, ctype) \
1822 RUNTIME_FUNCTION(Runtime_HasFixed##Type##Elements) { \
1823 if (args.length() != 1 || !IsJSObject(args[0])) { \
1824 return CrashUnlessFuzzing(isolate); \
1826 auto obj = Cast<JSObject>(args[0]); \
1827 return isolate->heap()->ToBoolean(obj->HasFixed##Type##Elements()); \
1832#undef FIXED_TYPED_ARRAYS_CHECK_RUNTIME_FUNCTION
1836 return isolate->heap()->ToBoolean(
1837 Protectors::IsIsConcatSpreadableLookupChainIntact(isolate));
1842 return isolate->heap()->ToBoolean(
1843 Protectors::IsTypedArrayLengthLookupChainIntact(isolate));
1848 return isolate->heap()->ToBoolean(
1849 Protectors::IsTypedArraySpeciesLookupChainIntact(isolate));
1854 return isolate->heap()->ToBoolean(
1855 Protectors::IsRegExpSpeciesLookupChainIntact(isolate));
1860 return isolate->heap()->ToBoolean(
1861 Protectors::IsPromiseSpeciesLookupChainIntact(isolate));
1866 return isolate->heap()->ToBoolean(
1867 Protectors::IsArraySpeciesLookupChainIntact(isolate));
1872 return isolate->heap()->ToBoolean(
1873 Protectors::IsMapIteratorLookupChainIntact(isolate));
1878 return isolate->heap()->ToBoolean(
1879 Protectors::IsSetIteratorLookupChainIntact(isolate));
1884 return isolate->heap()->ToBoolean(
1885 Protectors::IsStringIteratorLookupChainIntact(isolate));
1890 return isolate->heap()->ToBoolean(
1891 Protectors::IsArrayIteratorLookupChainIntact(isolate));
1896 return isolate->heap()->ToBoolean(Protectors::IsNoElementsIntact(isolate));
1901 return isolate->heap()->ToBoolean(
1902 Protectors::IsStringWrapperToPrimitiveIntact(isolate));
1918 isolate->native_context());
1924 if (
args.length() != 1) {
1925 return CrashUnlessFuzzing(isolate);
1929 Object::ObjectVerify(*
object, isolate);
1938 return isolate->heap()->ToBoolean(
true);
1945 if (
args.length() != 1 || !IsJSObject(
args[0])) {
1946 return CrashUnlessFuzzing(isolate);
1974 const char* name)
final {}
1983 int column)
final {}
1984#if V8_ENABLE_WEBASSEMBLY
1987 int code_offset,
int script_id)
final {}
1992 Address entry_point)
final {}
1994 Address entry_point)
final {}
2002 void SharedFunctionInfoMoveEvent(Address from, Address to)
final {}
2003 void NativeContextMoveEvent(Address from, Address to)
final {}
2004 void CodeMovingGCEvent()
final {}
2008 Address
pc,
int fp_to_sp_delta)
final {}
2011 const char* reason)
final {}
2012 void WeakCodeClearEvent()
final {}
2014 bool is_listening_to_code_events()
final {
return true; }
2017#if V8_ENABLE_WEBASSEMBLY
2020 isolate->logger()->AddListener(noop_listener.
get());
2026 if (
args.length() != 3 || !IsString(
args[0]) || !IsString(
args[1]) ||
2028 return CrashUnlessFuzzing(isolate);
2033 int backtrack_limit =
args.smi_value_at(2);
2034 if (backtrack_limit < 0) {
2035 return CrashUnlessFuzzing(isolate);
2039 if (!maybe_flags.has_value()) {
2040 return CrashUnlessFuzzing(isolate);
2042 JSRegExp::Flags flags = maybe_flags.value();
2061 return CrashUnlessFuzzing(isolate);
2065 return isolate->heap()->ToBoolean(obj1->
address() == obj2->address());
2071 return CrashUnlessFuzzing(isolate);
2074 return isolate->heap()->ToBoolean(IsString(*obj) &&
2083 return CrashUnlessFuzzing(isolate);
2090 if (!maybe_shared.
ToHandle(&shared)) {
2091 return CrashUnlessFuzzing(isolate);
2099 return CrashUnlessFuzzing(isolate);
2102 return isolate->heap()->ToBoolean(
2109 return CrashUnlessFuzzing(isolate);
2112 return isolate->heap()->ToBoolean(IsInternalizedString(*obj));
2117 if (
args.length() != 1 || !IsString(
args[0])) {
2118 return CrashUnlessFuzzing(isolate);
2122 size_t output_length;
2123 auto bytes =
string->
ToCString(&output_length);
2127 ->NewJSArrayBufferAndBackingStore(output_length,
2130 memcpy(
result->backing_store(), bytes.get(), output_length);
2136 if (
args.length() != 1 || !IsString(
args[0])) {
2137 return CrashUnlessFuzzing(isolate);
2146 ->NewJSArrayBufferAndBackingStore(value.length(),
2149 memcpy(
result->backing_store(), *value, value.length());
2155 if (!isolate->has_shared_space()) {
2156 return CrashUnlessFuzzing(isolate);
2158 isolate->heap()->CollectGarbageShared(isolate->main_thread_local_heap(),
2165 if (
args.length() != 1) {
2166 return CrashUnlessFuzzing(isolate);
2170 return primitive->NumWaitersForTesting(isolate);
2174 Runtime_AtomicsSychronizationNumAsyncWaitersInIsolateForTesting) {
2176 static_cast<uint32_t
>(isolate->async_waiter_queue_nodes().size()));
2181 if (
args.length() != 1 || !IsJSWeakCollection(
args[0])) {
2182 return CrashUnlessFuzzing(isolate);
2206 if (isolate->EfficiencyModeEnabled()) {
2214 if (
args.length() != 1) {
2215 return CrashUnlessFuzzing(isolate);
2218 isolate->set_battery_saver_mode_enabled(
true);
2220 isolate->set_battery_saver_mode_enabled(
false);
2223 if (
v8_flags.battery_saver_mode.value().has_value()) {
2234 const bool stress_deopt =
v8_flags.deopt_every_n_times > 0;
2240 if (
args.length() != 1) {
2241 return CrashUnlessFuzzing(isolate);
2244 if (!IsJSFunction(*function_object))
return CrashUnlessFuzzing(isolate);
2247 if (!function->has_feedback_vector()) {
2248 return CrashUnlessFuzzing(isolate);
2261 isolate->factory()->NewFixedArray(feedback_vector->length());
2271 std::ostringstream out;
2274 isolate->factory()->NewStringFromAsciiChecked(out.str().c_str());
2275 sub_result->set(0, *kind_string);
2280 std::ostringstream out;
2283 isolate->factory()->NewStringFromAsciiChecked(out.str().c_str());
2284 sub_result->set(1, *nexus_string);
2288 isolate->factory()->NewJSArrayWithElements(sub_result);
2289 result->set(result_ix++, *sub_result_array);
2292 return *isolate->factory()->NewJSArrayWithElements(
result);
2300#if defined(V8_ENABLE_DEBUG_CODE) && !V8_DISABLE_WRITE_BARRIERS_BOOL
2302 if (
args.length() != 2) {
2303 return CrashUnlessFuzzing(isolate);
2307 return CrashUnlessFuzzing(isolate);
2311 CHECK(!WriteBarrier::IsRequired(heap_object, value));
2321 if (
args.length() > 2 || !IsJSArrayBuffer(*
args.at(0))) {
2322 return CrashUnlessFuzzing(isolate);
2325 if (!array_buffer->GetBackingStore()->is_wasm_memory() ||
2326 array_buffer->is_shared()) {
2327 return CrashUnlessFuzzing(isolate);
2329 constexpr bool kForceForWasmMemory =
true;
2331 args.atOrUndefined(isolate, 1)),
#define BUILTIN_CODE(isolate, name)
static Local< FunctionTemplate > New(Isolate *isolate, FunctionCallback callback=nullptr, Local< Value > data=Local< Value >(), Local< Signature > signature=Local< Signature >(), int length=0, ConstructorBehavior behavior=ConstructorBehavior::kAllow, SideEffectType side_effect_type=SideEffectType::kHasSideEffect, const CFunction *c_function=nullptr, uint16_t instance_type=0, uint16_t allowed_receiver_instance_type_range_start=0, uint16_t allowed_receiver_instance_type_range_end=0)
void SetModifyCodeGenerationFromStringsCallback(ModifyCodeGenerationFromStringsCallback2 callback)
Local< Context > GetCurrentContext()
static Local< ObjectTemplate > New(Isolate *isolate, Local< FunctionTemplate > constructor=Local< FunctionTemplate >())
static v8::internal::DirectHandle< To > OpenDirectHandle(v8::Local< From > handle)
static const uint32_t kMaxLengthBits
static constexpr BytecodeOffset None()
constexpr bool IsNone() const
constexpr int ToInt() const
static bool CompileBaseline(Isolate *isolate, DirectHandle< JSFunction > function, ClearExceptionFlag flag, IsCompiledScope *is_compiled_scope)
static void CompileOptimized(Isolate *isolate, DirectHandle< JSFunction > function, ConcurrencyMode mode, CodeKind code_kind)
static bool Compile(Isolate *isolate, Handle< SharedFunctionInfo > shared, ClearExceptionFlag flag, IsCompiledScope *is_compiled_scope, CreateSourcePositions create_source_positions_flag=CreateSourcePositions::kNo)
static V8_WARN_UNUSED_RESULT MaybeHandle< Code > CompileOptimizedOSR(Isolate *isolate, DirectHandle< JSFunction > function, BytecodeOffset osr_offset, ConcurrencyMode mode, CodeKind code_kind)
static V8_EXPORT_PRIVATE MaybeDirectHandle< Object > Global(Isolate *isolate, Handle< String > source, debug::EvaluateGlobalMode mode, REPLMode repl_mode=REPLMode::kNo)
static void DeoptimizeFunction(Tagged< JSFunction > function, LazyDeoptimizeReason reason, Tagged< Code > code={})
V8_INLINE Address address() const
void Print(std::ostream &os)
static constexpr int kMaxOsrUrgency
static constexpr int kMaxRegularLength
static V8_INLINE bool InYoungGeneration(Tagged< Object > object)
static V8_INLINE bool InReadOnlySpace(Tagged< HeapObject > object)
void TakeSnapshotToFile(const v8::HeapProfiler::HeapSnapshotOptions options, std::string filename)
HeapProfiler * heap_profiler() const
V8_EXPORT_PRIVATE static V8_WARN_UNUSED_RESULT Maybe< bool > Detach(DirectHandle< JSArrayBuffer > buffer, bool force_for_wasm_memory=false, DirectHandle< Object > key={})
void ClearAllTypeFeedbackInfoForTesting()
static V8_EXPORT_PRIVATE void EnsureFeedbackVector(Isolate *isolate, DirectHandle< JSFunction > function, IsCompiledScope *compiled_scope)
FeedbackVector eventually. Generally this shouldn't be used to get the.
static V8_EXPORT_PRIVATE MaybeDirectHandle< JSRegExp > New(Isolate *isolate, DirectHandle< String > source, Flags flags, uint32_t backtrack_limit=kNoBacktrackLimit)
static std::optional< Flags > FlagsFromString(Isolate *isolate, DirectHandle< String > flags)
static void PrintTop(Isolate *isolate, FILE *file, bool print_args, bool print_line_number)
BytecodeOffset GetBytecodeOffsetForOSR() const
DirectHandle< JSFunction > GetInnermostFunction() const
static MaglevFrame * cast(StackFrame *frame)
static void MarkFunctionForManualOptimization(Isolate *isolate, DirectHandle< JSFunction > function, IsCompiledScope *is_compiled_scope)
static bool IsMarkedForManualOptimization(Isolate *isolate, Tagged< JSFunction > function)
static void CompleteInobjectSlackTracking(Isolate *isolate, Tagged< Map > initial_map)
V8_WARN_UNUSED_RESULT V8_INLINE bool ToHandle(DirectHandle< S > *out) const
static bool ToIntegerIndex(Tagged< Object > obj, size_t *index)
static HandleType< Object >::MaybeType Share(Isolate *isolate, HandleType< T > value, ShouldThrow throw_if_cannot_be_shared)
static Tagged< AllocationMemento > FindAllocationMemento(Heap *heap, Tagged< Map > map, Tagged< HeapObject > object)
V8_EXPORT_PRIVATE void PretenureAllocationSiteOnNextCollection(Tagged< AllocationSite > site)
V8_INLINE Tagged< Boolean > boolean_value(bool value) const
static bool IsUnmodifiedRegExp(Isolate *isolate, DirectHandle< JSRegExp > regexp)
static V8_EXPORT_PRIVATE void DiscardCompiled(Isolate *isolate, DirectHandle< SharedFunctionInfo > shared_info)
static constexpr Tagged< Smi > FromInt(int value)
static V8_EXPORT_PRIVATE void SerializeDeserializeAndVerifyForTesting(Isolate *isolate, DirectHandle< Context > default_context)
bool is_interpreted() const
static bool IsInPlaceInternalizable(Tagged< String > string)
std::unique_ptr< char[]> ToCString(uint32_t offset, uint32_t length, size_t *length_output=nullptr)
constexpr bool IsCleared() const
constexpr bool IsWeak() const
Tagged< Object > GetHeapObjectOrSmi() const
V8_INLINE constexpr bool is_null() const
static UnoptimizedJSFrame * cast(StackFrame *frame)
Tagged< BytecodeArray > GetBytecodeArray() const
virtual int GetBytecodeOffset() const =0
void EnableCodeLogging(Isolate *)
#define RUNTIME_FUNCTION(Name)
#define ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, dst, call)
#define MAYBE_RETURN(call, value)
#define RETURN_RESULT_OR_FAILURE(isolate, call)
base::Vector< const DirectHandle< Object > > args
#define V8_ENABLE_TURBOFAN_BOOL
SharedFunctionInfoRef shared
DirectHandle< JSReceiver > options
ZoneVector< RpoNumber > & result
constexpr double uint64_to_double(uint64_t d64)
constexpr Vector< const char > StaticCharVector(const char(&array)[N])
constexpr bool IsInRange(T value, U lower_limit, U higher_limit)
V8_INLINE bool ControlledCrashesAreHarmless()
static bool IsMaglevOsrEnabled()
static bool IsMaglevEnabled()
WasmEngine * GetWasmEngine()
constexpr int kTaggedSize
PerThreadAssertScopeDebugOnly< false, SAFEPOINTS_ASSERT, HEAP_ALLOCATION_ASSERT > DisallowGarbageCollection
static void ReturnNull(const v8::FunctionCallbackInfo< v8::Value > &info)
static void DebugPrintImpl(Tagged< MaybeObject > maybe_object, std::ostream &os)
void PrintF(const char *format,...)
Tagged(T object) -> Tagged< T >
V8_INLINE constexpr bool IsSmi(TaggedImpl< kRefType, StorageType > obj)
BUILTIN_FP_CALL BUILTIN_FP_CALL BUILTIN_FP_CALL BUILTIN_FP_CALL BUILTIN_FP_CALL BUILTIN_FP_CALL BUILTIN_FP_CALL BUILTIN_FP_CALL BUILTIN_FP_CALL BUILTIN_FP_CALL int character
V8_INLINE DirectHandle< T > direct_handle(Tagged< T > object, Isolate *isolate)
int g_num_isolates_for_testing
void Print(Tagged< Object > obj)
constexpr int kSystemPointerSize
const char * GetAbortReason(AbortReason reason)
bool IsShared(Tagged< Object > obj)
bool V8_EXPORT ValidateCallbackInfo(const FunctionCallbackInfo< void > &info)
uint32_t NumberToUint32(Tagged< Object > number)
void ShortPrint(Tagged< Object > obj, FILE *out)
void TraceManualRecompile(Tagged< JSFunction > function, CodeKind code_kind, ConcurrencyMode concurrency_mode)
@ kMarkedForConcurrentMaglevOptimization
@ kOptimizingConcurrently
@ kTopmostFrameIsInterpreted
@ kMarkedForDeoptimization
@ kTopmostFrameIsTurboFanned
@ kOptimizeMaglevOptimizesToTurbofan
@ kOptimizeOnNextCallOptimizesToMaglev
@ kMarkedForConcurrentOptimization
@ kTopmostFrameIsBaseline
@ kMarkedForMaglevOptimization
V8_INLINE constexpr bool IsObject(TaggedImpl< kRefType, StorageType > obj)
V8_INLINE constexpr bool IsHeapObject(TaggedImpl< kRefType, StorageType > obj)
V8_EXPORT_PRIVATE FlagValues v8_flags
Arguments< ArgumentsType::kRuntime > RuntimeArguments
template const char * string
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
static constexpr AcquireLoadTag kAcquireLoad
#define CONVERT_INT32_ARG_FUZZ_SAFE(name, index)
#define CONVERT_BOOLEAN_ARG_FUZZ_SAFE(name, index)
#define FIXED_TYPED_ARRAYS_CHECK_RUNTIME_FUNCTION(Type, type, TYPE, ctype)
#define ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(Name)
#define CHECK_LT(lhs, rhs)
#define CHECK_NE(lhs, rhs)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
NumericsMode numerics_mode
#define OFFSET_OF_DATA_START(Type)
#define V8_WARN_UNUSED_RESULT
#define V8_UNLIKELY(condition)