23#ifdef V8_USE_ADDRESS_SANITIZER
24#include <sanitizer/asan_interface.h>
30#ifdef V8_ENABLE_SANDBOX
32SandboxTesting::Mode SandboxTesting::mode_ = SandboxTesting::Mode::kDisabled;
34#ifdef V8_ENABLE_MEMORY_CORRUPTION_API
42 double sandbox_base = Sandbox::current()->base();
49 double sandbox_size = Sandbox::current()->size();
59 if (!info.IsConstructCall()) {
60 isolate->ThrowError(
"Sandbox.MemoryView must be invoked with 'new'");
64 Local<v8::Integer> arg1, arg2;
65 if (!info[0]->ToInteger(context).
ToLocal(&arg1) ||
66 !info[1]->ToInteger(context).
ToLocal(&arg2)) {
67 isolate->ThrowError(
"Expects two number arguments (start offset and size)");
71 Sandbox* sandbox = Sandbox::current();
74 uint64_t
offset = arg1->Value();
75 uint64_t size = arg2->Value();
76 if (
offset > sandbox->size() || size > sandbox->size() ||
77 (
offset + size) > sandbox->size()) {
79 "The MemoryView must be entirely contained within the sandbox");
83 Factory* factory =
reinterpret_cast<Isolate*
>(
isolate)->factory();
85 reinterpret_cast<void*
>(sandbox->base() +
offset), size,
88 isolate->ThrowError(
"Out of memory: MemoryView backing store");
92 info.GetReturnValue().Set(Utils::ToLocal(buffer));
98using ArgumentObjectExtractorFunction = std::function<
bool(
101static bool GetArgumentObjectPassedAsReference(
105 if (info.Length() == 0) {
106 isolate->ThrowError(
"First argument must be provided");
112 isolate->ThrowError(
"First argument must be a HeapObject");
120static bool GetArgumentObjectPassedAsAddress(
122 Sandbox* sandbox = Sandbox::current();
126 if (info.Length() == 0) {
127 isolate->ThrowError(
"First argument must be provided");
131 Local<v8::Uint32> arg1;
132 if (!info[0]->ToUint32(context).
ToLocal(&arg1)) {
133 isolate->ThrowError(
"First argument must be the address of a HeapObject");
137 uint32_t address = arg1->Value();
141 address &= ~kHeapObjectTagMask;
152 if (!GetArgumentObjectPassedAsReference(info, &obj)) {
159 uint32_t address =
static_cast<uint32_t
>(obj->address());
169 if (!GetArgumentObjectPassedAsAddress(info, &obj)) {
173 Isolate* i_isolate =
reinterpret_cast<Isolate*
>(
isolate);
174 Handle<Object>
handle(obj, i_isolate);
182 Sandbox* sandbox = Sandbox::current();
184 auto IsLocatedInMappedMemory = [&](
Address address) {
185 if (
heap->memory_allocator()->LookupChunkContainingAddress(address) !=
189 return heap->read_only_space()->ContainsSlow(address);
193 if (!GetArgumentObjectPassedAsAddress(info, &obj)) {
199 info.GetReturnValue().Set(
false);
200 Address current = obj.address();
201 for (
int i = 0;
i < 3;
i++) {
202 if (!IsLocatedInMappedMemory(current)) {
205 uint32_t map_word = *
reinterpret_cast<uint32_t*
>(
current);
210 if (map_address == current) {
211 info.GetReturnValue().Set(
true);
214 current = map_address;
218static void SandboxIsWritableImpl(
220 ArgumentObjectExtractorFunction getArgumentObject) {
224 if (!getArgumentObject(info, &obj)) {
229 bool is_writable = chunk->IsWritable();
230 info.GetReturnValue().Set(is_writable);
235 SandboxIsWritableImpl(info, &GetArgumentObjectPassedAsReference);
239void SandboxIsWritableObjectAt(
241 SandboxIsWritableImpl(info, &GetArgumentObjectPassedAsAddress);
244static void SandboxGetSizeOfImpl(
246 ArgumentObjectExtractorFunction getArgumentObject) {
250 if (!getArgumentObject(info, &obj)) {
254 int size = obj->Size();
255 info.GetReturnValue().Set(size);
260 SandboxGetSizeOfImpl(info, &GetArgumentObjectPassedAsReference);
265 SandboxGetSizeOfImpl(info, &GetArgumentObjectPassedAsAddress);
268static void SandboxGetInstanceTypeOfImpl(
270 ArgumentObjectExtractorFunction getArgumentObject) {
275 if (!getArgumentObject(info, &obj)) {
280 std::stringstream out;
282 MaybeLocal<v8::String>
result =
284 info.GetReturnValue().Set(
result.ToLocalChecked());
289 SandboxGetInstanceTypeOfImpl(info, &GetArgumentObjectPassedAsReference);
293void SandboxGetInstanceTypeOfObjectAt(
295 SandboxGetInstanceTypeOfImpl(info, &GetArgumentObjectPassedAsAddress);
298static void SandboxGetInstanceTypeIdOfImpl(
300 ArgumentObjectExtractorFunction getArgumentObject) {
304 if (!getArgumentObject(info, &obj)) {
309 static_assert(std::is_same_v<std::underlying_type_t<InstanceType>,
uint16_t>);
313 const uint16_t kUnknownInstanceType = std::numeric_limits<uint16_t>::max();
317 info.GetReturnValue().Set(type);
321void SandboxGetInstanceTypeIdOf(
323 SandboxGetInstanceTypeIdOfImpl(info, &GetArgumentObjectPassedAsReference);
327void SandboxGetInstanceTypeIdOfObjectAt(
329 SandboxGetInstanceTypeIdOfImpl(info, &GetArgumentObjectPassedAsAddress);
333void SandboxGetInstanceTypeIdFor(
340 isolate->ThrowError(
"First argument must be a string");
344 auto& all_types = SandboxTesting::GetInstanceTypeMap();
345 if (all_types.find(*type_name) == all_types.end()) {
347 "Unknown type name. If needed, add it in "
348 "SandboxTesting::GetInstanceTypeMap");
353 info.GetReturnValue().Set(type_id);
377 if (!info[0]->IsInt32()) {
378 isolate->ThrowError(
"Second argument must be an integer");
382 int raw_type = info[0]->Int32Value(context).FromMaybe(-1);
383 if (raw_type < FIRST_TYPE || raw_type >
LAST_TYPE) {
384 isolate->ThrowError(
"Invalid instance type");
391 isolate->ThrowError(
"Second argument must be a string");
395 auto& all_fields = SandboxTesting::GetFieldOffsetMap();
396 if (all_fields.find(instance_type) == all_fields.end()) {
398 "Unknown object type. If needed, add it in "
399 "SandboxTesting::GetFieldOffsetMap");
403 auto& obj_fields = all_fields[instance_type];
404 if (obj_fields.find(*field_name) == obj_fields.end()) {
406 "Unknown field. If needed, add it in "
407 "SandboxTesting::GetFieldOffsetMap");
411 int offset = obj_fields[*field_name];
412 info.GetReturnValue().Set(
offset);
420 Local<FunctionTemplate> function_template =
440 Factory* factory = isolate->factory();
441 Handle<String> function_name = factory->NewStringFromAsciiChecked(name);
444 function->shared()->set_length(num_parameters);
450 Factory* factory = isolate->factory();
451 Handle<String> property_name = factory->NewStringFromAsciiChecked(name);
453 Handle<Object>
setter = factory->null_value();
460 int num_parameters) {
461 InstallFunc(isolate, holder, func, name, num_parameters,
false);
466 int num_parameters) {
467 InstallFunc(isolate, holder, func, name, num_parameters,
true);
471void SandboxTesting::InstallMemoryCorruptionApi(Isolate* isolate) {
472#ifndef V8_ENABLE_MEMORY_CORRUPTION_API
473#error "This function should not be available in any shipping build " \
474 "where it could potentially be abused to facilitate exploitation."
477 CHECK(Sandbox::current()->is_initialized());
484 InstallGetter(isolate, sandbox, SandboxGetBase,
"base");
485 InstallGetter(isolate, sandbox, SandboxGetByteLength,
"byteLength");
486 InstallConstructor(isolate, sandbox, SandboxMemoryView,
"MemoryView", 2);
487 InstallFunction(isolate, sandbox, SandboxGetAddressOf,
"getAddressOf", 1);
488 InstallFunction(isolate, sandbox, SandboxGetObjectAt,
"getObjectAt", 1);
489 InstallFunction(isolate, sandbox, SandboxIsValidObjectAt,
"isValidObjectAt",
491 InstallFunction(isolate, sandbox, SandboxIsWritable,
"isWritable", 1);
492 InstallFunction(isolate, sandbox, SandboxIsWritableObjectAt,
493 "isWritableObjectAt", 1);
494 InstallFunction(isolate, sandbox, SandboxGetSizeOf,
"getSizeOf", 1);
495 InstallFunction(isolate, sandbox, SandboxGetSizeOfObjectAt,
496 "getSizeOfObjectAt", 1);
497 InstallFunction(isolate, sandbox, SandboxGetInstanceTypeOf,
498 "getInstanceTypeOf", 1);
499 InstallFunction(isolate, sandbox, SandboxGetInstanceTypeOfObjectAt,
500 "getInstanceTypeOfObjectAt", 1);
501 InstallFunction(isolate, sandbox, SandboxGetInstanceTypeIdOf,
502 "getInstanceTypeIdOf", 1);
503 InstallFunction(isolate, sandbox, SandboxGetInstanceTypeIdOfObjectAt,
504 "getInstanceTypeIdOfObjectAt", 1);
505 InstallFunction(isolate, sandbox, SandboxGetInstanceTypeIdFor,
506 "getInstanceTypeIdFor", 1);
507 InstallFunction(isolate, sandbox, SandboxGetFieldOffset,
"getFieldOffset", 2);
511 Handle<String> name =
512 isolate->factory()->NewStringFromAsciiChecked(
"Sandbox");
521void PrintToStderr(
const char* output) {
524 ssize_t return_val = write(STDERR_FILENO, output, strlen(output));
528[[noreturn]]
void FilterCrash(
const char* reason) {
531 PrintToStderr(reason);
538 SandboxTesting::mode() == SandboxTesting::Mode::kForFuzzing ? -1 : 0;
546struct sigaction g_old_sigabrt_handler, g_old_sigtrap_handler,
547 g_old_sigbus_handler, g_old_sigsegv_handler;
549void UninstallCrashFilter() {
560 sigaction(SIGABRT, &g_old_sigabrt_handler,
nullptr);
561 sigaction(SIGTRAP, &g_old_sigtrap_handler,
nullptr);
562 sigaction(SIGBUS, &g_old_sigbus_handler,
nullptr);
563 sigaction(SIGSEGV, &g_old_sigsegv_handler,
nullptr);
568#ifdef V8_USE_ADDRESS_SANITIZER
569 __sanitizer_set_death_callback(
nullptr);
573void CrashFilter(
int signal, siginfo_t* info,
void* void_context) {
577 if (signal == SIGABRT) {
579 FilterCrash(
"Caught harmless signal (SIGABRT). Exiting process...\n");
582 if (signal == SIGTRAP) {
584 FilterCrash(
"Caught harmless signal (SIGTRAP). Exiting process...\n");
589 if (Sandbox::current()->Contains(faultaddr)) {
591 "Caught harmless memory access violation (inside sandbox address "
592 "space). Exiting process...\n");
595 if (info->si_code == SI_KERNEL && faultaddr == 0) {
603 "Caught harmless memory access violation (non-canonical address). "
604 "Exiting process...\n");
607 if (faultaddr >= 0x8000'0000'0000'0000ULL) {
614 "Caught harmless memory access violation (kernel space address). "
615 "Exiting process...\n");
618 if (faultaddr < 0x1000) {
623 "Caught harmless memory access violation (nullptr dereference). "
624 "Exiting process...\n");
627 if (faultaddr < 4ULL * GB) {
631 "Caught harmless memory access violation (first 4GB of virtual address "
632 "space). Exiting process...\n");
659 int pthread_error = pthread_getattr_np(pthread_self(), &attr);
660 if (!pthread_error) {
661 uintptr_t stack_base;
663 pthread_error = pthread_attr_getstack(
664 &attr,
reinterpret_cast<void**
>(&stack_base), &stack_size);
669 const size_t kMinStackGuardRegionSize = sysconf(_SC_PAGESIZE);
670 uintptr_t stack_guard_region_start = stack_base - kMinStackGuardRegionSize;
671 uintptr_t stack_guard_region_end = stack_base;
672 if (!pthread_error && stack_guard_region_start <= faultaddr &&
673 faultaddr < stack_guard_region_end) {
674 FilterCrash(
"Caught harmless stack overflow. Exiting process...\n");
678 if (info->si_code == SEGV_ACCERR) {
694 "Caught harmless memory access violation (memory permission "
695 "violation). Exiting process...\n");
702 UninstallCrashFilter();
704 PrintToStderr(
"\n## V8 sandbox violation detected!\n\n");
707#ifdef V8_USE_ADDRESS_SANITIZER
708void AsanFaultHandler() {
709 Address faultaddr =
reinterpret_cast<Address>(__asan_get_report_address());
713 "Caught ASan fault without a fault address. Ignoring it as we cannot "
714 "check if it is a sandbox violation. Exiting process...\n");
717 if (Sandbox::current()->Contains(faultaddr)) {
719 "Caught harmless ASan fault (inside sandbox address space). Exiting "
725 UninstallCrashFilter();
727 PrintToStderr(
"\n## V8 sandbox violation detected!\n\n");
731void InstallCrashFilter() {
743 stack_t signalstack = {
744 .ss_sp =
reinterpret_cast<void*
>(alternate_stack),
746 .ss_size =
static_cast<size_t>(SIGSTKSZ),
748 CHECK_EQ(sigaltstack(&signalstack,
nullptr), 0);
750 struct sigaction action;
751 memset(&action, 0,
sizeof(action));
752 action.sa_flags = SA_SIGINFO | SA_ONSTACK;
753 action.sa_sigaction = &CrashFilter;
754 sigemptyset(&action.sa_mask);
757 success &= (sigaction(SIGABRT, &action, &g_old_sigabrt_handler) == 0);
758 success &= (sigaction(SIGTRAP, &action, &g_old_sigtrap_handler) == 0);
759 success &= (sigaction(SIGBUS, &action, &g_old_sigbus_handler) == 0);
760 success &= (sigaction(SIGSEGV, &action, &g_old_sigsegv_handler) == 0);
763#if defined(V8_USE_ADDRESS_SANITIZER)
764 __sanitizer_set_death_callback(&AsanFaultHandler);
765#elif defined(V8_USE_MEMORY_SANITIZER) || \
766 defined(V8_USE_UNDEFINED_BEHAVIOR_SANITIZER)
768 FATAL(
"The sandbox crash filter currently only supports AddressSanitizer");
775void SandboxTesting::Enable(Mode mode) {
778 CHECK(Sandbox::current()->is_initialized());
783 "Sandbox testing mode is enabled. Only sandbox violations will be "
784 "reported, all other crashes will be ignored.\n");
787 InstallCrashFilter();
789 FATAL(
"The sandbox crash filter is currently only available on Linux");
793SandboxTesting::InstanceTypeMap& SandboxTesting::GetInstanceTypeMap() {
798 static base::LeakyObject<InstanceTypeMap> g_known_instance_types;
799 auto& types = *g_known_instance_types.get();
800 bool is_initialized = types.size() != 0;
801 if (!is_initialized) {
802 types[
"JS_OBJECT_TYPE"] = JS_OBJECT_TYPE;
803 types[
"JS_FUNCTION_TYPE"] = JS_FUNCTION_TYPE;
804 types[
"JS_ARRAY_TYPE"] = JS_ARRAY_TYPE;
805 types[
"JS_ARRAY_BUFFER_TYPE"] = JS_ARRAY_BUFFER_TYPE;
806 types[
"JS_TYPED_ARRAY_TYPE"] = JS_TYPED_ARRAY_TYPE;
809 types[
"INTERNALIZED_ONE_BYTE_STRING_TYPE"] =
813 types[
"SHARED_FUNCTION_INFO_TYPE"] = SHARED_FUNCTION_INFO_TYPE;
814 types[
"SCRIPT_TYPE"] = SCRIPT_TYPE;
815#ifdef V8_ENABLE_WEBASSEMBLY
816 types[
"WASM_MODULE_OBJECT_TYPE"] = WASM_MODULE_OBJECT_TYPE;
817 types[
"WASM_INSTANCE_OBJECT_TYPE"] = WASM_INSTANCE_OBJECT_TYPE;
818 types[
"WASM_FUNC_REF_TYPE"] = WASM_FUNC_REF_TYPE;
819 types[
"WASM_TABLE_OBJECT_TYPE"] = WASM_TABLE_OBJECT_TYPE;
825SandboxTesting::FieldOffsetMap& SandboxTesting::GetFieldOffsetMap() {
830 static base::LeakyObject<FieldOffsetMap> g_known_fields;
831 auto& fields = *g_known_fields.get();
832 bool is_initialized = fields.size() != 0;
833 if (!is_initialized) {
834#ifdef V8_ENABLE_LEAPTIERING
835 fields[JS_FUNCTION_TYPE][
"dispatch_handle"] =
836 JSFunction::kDispatchHandleOffset;
838 fields[JS_FUNCTION_TYPE][
"shared_function_info"] =
839 JSFunction::kSharedFunctionInfoOffset;
840 fields[JS_ARRAY_TYPE][
"elements"] = JSArray::kElementsOffset;
841 fields[JS_ARRAY_TYPE][
"length"] = JSArray::kLengthOffset;
842 fields[JS_TYPED_ARRAY_TYPE][
"length"] = JSTypedArray::kRawLengthOffset;
843 fields[JS_TYPED_ARRAY_TYPE][
"byte_length"] =
844 JSTypedArray::kRawByteLengthOffset;
845 fields[JS_TYPED_ARRAY_TYPE][
"byte_offset"] =
846 JSTypedArray::kRawByteOffsetOffset;
847 fields[JS_TYPED_ARRAY_TYPE][
"external_pointer"] =
848 JSTypedArray::kExternalPointerOffset;
849 fields[JS_TYPED_ARRAY_TYPE][
"base_pointer"] =
850 JSTypedArray::kBasePointerOffset;
852 offsetof(SeqOneByteString,
length_);
854 offsetof(SeqTwoByteString, raw_hash_field_);
856 offsetof(SeqTwoByteString,
length_);
858 offsetof(InternalizedString,
length_);
860 offsetof(SlicedString,
parent_);
864 fields[SHARED_FUNCTION_INFO_TYPE][
"trusted_function_data"] =
865 SharedFunctionInfo::kTrustedFunctionDataOffset;
866 fields[SHARED_FUNCTION_INFO_TYPE][
"length"] =
867 SharedFunctionInfo::kLengthOffset;
868 fields[SHARED_FUNCTION_INFO_TYPE][
"formal_parameter_count"] =
869 SharedFunctionInfo::kFormalParameterCountOffset;
870 fields[SCRIPT_TYPE][
"wasm_managed_native_module"] =
871 Script::kEvalFromPositionOffset;
872#ifdef V8_ENABLE_WEBASSEMBLY
873 fields[WASM_MODULE_OBJECT_TYPE][
"managed_native_module"] =
874 WasmModuleObject::kManagedNativeModuleOffset;
875 fields[WASM_MODULE_OBJECT_TYPE][
"script"] = WasmModuleObject::kScriptOffset;
876 fields[WASM_INSTANCE_OBJECT_TYPE][
"module_object"] =
877 WasmInstanceObject::kModuleObjectOffset;
878 fields[WASM_FUNC_REF_TYPE][
"trusted_internal"] =
879 WasmFuncRef::kTrustedInternalOffset;
880 fields[WASM_TABLE_OBJECT_TYPE][
"entries"] = WasmTableObject::kEntriesOffset;
881 fields[WASM_TABLE_OBJECT_TYPE][
"current_length"] =
882 WasmTableObject::kCurrentLengthOffset;
883 fields[WASM_TABLE_OBJECT_TYPE][
"maximum_length"] =
884 WasmTableObject::kMaximumLengthOffset;
885 fields[WASM_TABLE_OBJECT_TYPE][
"raw_type"] =
886 WasmTableObject::kRawTypeOffset;
static void EmptyDeleter(void *data, size_t length, void *deleter_data)
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)
static Local< Integer > NewFromUnsigned(Isolate *isolate, uint32_t value)
Local< Context > GetCurrentContext()
static Local< Number > New(Isolate *isolate, double value)
static V8_WARN_UNUSED_RESULT MaybeLocal< String > NewFromUtf8(Isolate *isolate, const char *data, NewStringType type=NewStringType::kNormal, int length=-1)
static v8::internal::Handle< To > OpenHandle(v8::Local< From > handle)
static constexpr Address kNoHint
static V8_WARN_UNUSED_RESULT MaybeHandle< JSFunction > InstantiateFunction(Isolate *isolate, DirectHandle< NativeContext > native_context, DirectHandle< FunctionTemplateInfo > data, MaybeDirectHandle< Name > maybe_name={})
static std::unique_ptr< BackingStore > WrapAllocation(void *allocation_base, size_t allocation_length, v8::BackingStore::DeleterCallback deleter, void *deleter_data, SharedFlag shared)
static Tagged< HeapObject > FromAddress(Address address)
static V8_EXPORT_PRIVATE void AddProperty(Isolate *isolate, DirectHandle< JSObject > object, DirectHandle< Name > name, DirectHandle< Object > value, PropertyAttributes attributes)
static V8_EXPORT_PRIVATE MaybeDirectHandle< Object > DefineOwnAccessorIgnoreAttributes(DirectHandle< JSObject > object, DirectHandle< Name > name, DirectHandle< Object > getter, DirectHandle< Object > setter, PropertyAttributes attributes)
RecordWriteMode const mode_
ZoneVector< RpoNumber > & result
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
kInterpreterTrampolineOffset Tagged< HeapObject >
constexpr uint64_t kMaxSafeIntegerUint64
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 allocation gc speed threshold for starting incremental marking via a task in percent of available threshold for starting incremental marking immediately in percent of available Use a single schedule for determining a marking schedule between JS and C objects schedules the minor GC task with kUserVisible priority max worker number of concurrent for NumberOfWorkerThreads start background threads that allocate memory concurrent_array_buffer_sweeping use parallel threads to clear weak refs in the atomic pause trace progress of the incremental marking trace object counts and memory usage report a tick only when allocated zone memory changes by this amount TracingFlags::gc_stats TracingFlags::gc_stats track native contexts that are expected to be garbage collected verify heap pointers before and after GC memory reducer runs GC with ReduceMemoryFootprint flag Maximum number of memory reducer GCs scheduled Old gen GC speed is computed directly from gc tracer counters Perform compaction on full GCs based on V8 s default heuristics Perform compaction on every full GC Perform code space compaction when finalizing a full GC with stack Stress GC compaction to flush out bugs with moving objects flush of baseline code when it has not been executed recently Use time base code flushing instead of age Use a progress bar to scan large objects in increments when incremental marking is active force incremental marking for small heaps and run it more often force marking at random points between and force scavenge at random points between and reclaim otherwise unreachable unmodified wrapper objects when possible less compaction in non memory reducing mode use high priority threads for concurrent Marking Test mode only flag It allows an unit test to select evacuation candidates use incremental marking for CppHeap cppheap_concurrent_marking c value for membalancer A special constant to balance between memory and space tradeoff The smaller the more memory it uses enable use of SSE4 instructions if available enable use of AVX VNNI instructions if available enable use of POPCNT instruction if available force all emitted branches to be in long mode(MIPS/PPC only)") DEFINE_BOOL(partial_constant_pool
bool V8_EXPORT ValidateCallbackInfo(const FunctionCallbackInfo< void > &info)
v8::VirtualAddressSpace * GetPlatformVirtualAddressSpace()
@ SEQ_ONE_BYTE_STRING_TYPE
@ CONS_ONE_BYTE_STRING_TYPE
@ SLICED_ONE_BYTE_STRING_TYPE
@ SEQ_TWO_BYTE_STRING_TYPE
@ INTERNALIZED_ONE_BYTE_STRING_TYPE
V8_INLINE constexpr bool IsHeapObject(TaggedImpl< kRefType, StorageType > obj)
static constexpr Address kNullAddress
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)
void(*)(const FunctionCallbackInfo< Value > &info) FunctionCallback
v8::Local< T > ToApiHandle(v8::internal::DirectHandle< v8::internal::Object > obj)
static i::DirectHandle< i::FunctionTemplateInfo > NewFunctionTemplate(i::Isolate *i_isolate, FunctionCallback func, bool has_prototype, SideEffectType side_effect_type=SideEffectType::kHasSideEffect)
BytecodeSequenceNode * parent_
#define CHECK_LE(lhs, rhs)
#define CHECK_NE(lhs, rhs)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)