8#include <unordered_set>
44 size_t* embedder_fields_count,
45 size_t* inobject_smi_fields_count,
46 size_t* boxed_double_fields_count,
47 size_t* string_data_count,
size_t* raw_fields_count)
60 size_t tagged_fields_count_in_object =
64 DCHECK_LE(tagged_fields_count_in_object, object_size_in_words);
65 size_t raw_fields_count_in_object =
66 object_size_in_words - tagged_fields_count_in_object;
72 tagged_fields_count_in_object);
81 }
else if (IsHeapNumber(host,
cage_base())) {
85 }
else if (IsSeqString(host,
cage_base())) {
89 DCHECK_LE(string_data, raw_fields_count_in_object);
90 raw_fields_count_in_object -= string_data;
155 if (!map->is_dictionary_map()) {
157 for (
InternalIndex descriptor : map->IterateOwnDescriptors()) {
162 if (!index.is_inobject())
break;
164 ++stats.smi_fields_count_;
179 if (clear_last_time_stats) {
196 for (
int i = 0;
i < len;
i++) {
198 if (
i != (len - 1))
PrintF(
", ");
205 stream << PrintCollection(base::Vector<size_t>(array, len));
209 PrintF(
"\"isolate\": \"%p\", \"id\": %d, \"key\": \"%s\", ",
210 reinterpret_cast<void*
>(
isolate()), gc_count,
key);
214 const char* name,
int index) {
217 PrintF(
"\"type\": \"instance_type_data\", ");
218 PrintF(
"\"instance_type\": %d, ", index);
219 PrintF(
"\"instance_type_name\": \"%s\", ", name);
223 PrintF(
"\"histogram\": ");
226 PrintF(
"\"over_allocated_histogram\": ");
238 PrintF(
"\"type\": \"gc_descriptor\", \"time\": %f }\n", time);
242 PrintF(
"\"type\": \"field_data\"");
244 PrintF(
", \"embedder_fields\": %zu",
246 PrintF(
", \"inobject_smi_fields\": %zu",
248 PrintF(
", \"boxed_double_fields\": %zu",
256 PrintF(
"\"type\": \"bucket_sizes\", \"sizes\": [ ");
263#define INSTANCE_TYPE_WRAPPER(name) \
264 PrintInstanceTypeJSON(key, gc_count, #name, name);
266#define VIRTUAL_INSTANCE_TYPE_WRAPPER(name) \
267 PrintInstanceTypeJSON( \
268 key, gc_count, #name, \
269 FIRST_VIRTUAL_TYPE + static_cast<int>(VirtualInstanceType::name));
274#undef INSTANCE_TYPE_WRAPPER
275#undef VIRTUAL_INSTANCE_TYPE_WRAPPER
279 const char* name,
int index) {
280 stream <<
"\"" << name <<
"\":{";
281 stream <<
"\"type\":" <<
static_cast<int>(
index) <<
",";
285 stream <<
"\"histogram\":";
287 stream <<
",\"over_allocated_histogram\":";
297 stream <<
"\"isolate\":\"" <<
reinterpret_cast<void*
>(
isolate()) <<
"\",";
298 stream <<
"\"id\":" << gc_count <<
",";
299 stream <<
"\"time\":" << time <<
",";
302 stream <<
"\"field_data\":{";
304 stream <<
",\"embedder_fields\":"
306 stream <<
",\"inobject_smi_fields\": "
308 stream <<
",\"boxed_double_fields\": "
311 stream <<
",\"other_raw_fields\":"
315 stream <<
"\"bucket_sizes\":[";
321 stream <<
"\"type_data\":{";
323#define INSTANCE_TYPE_WRAPPER(name) DumpInstanceTypeData(stream, #name, name);
325#define VIRTUAL_INSTANCE_TYPE_WRAPPER(name) \
326 DumpInstanceTypeData( \
328 FIRST_VIRTUAL_TYPE + static_cast<int>(VirtualInstanceType::name));
332 stream <<
"\"END\":{}}}";
334#undef INSTANCE_TYPE_WRAPPER
335#undef VIRTUAL_INSTANCE_TYPE_WRAPPER
347int Log2ForSize(
size_t size) {
355 if (size == 0)
return 0;
361 size_t over_allocated) {
371 size_t size,
size_t over_allocated) {
373 int type =
static_cast<int>(typeEnum);
411 size_t size,
size_t over_allocated,
425 template <
typename Dictionary>
486 field_stats_collector_(
487 heap_, &stats->tagged_fields_count_, &stats->embedder_fields_count_,
488 &stats->inobject_smi_fields_count_,
489 &stats->boxed_double_fields_count_, &stats->string_data_count_,
490 &stats->raw_fields_count_) {}
494 if (IsFixedArrayExact(obj)) {
503template <
typename Dictionary>
507 size_t over_allocated =
508 (hash_table->Capacity() - (hash_table->NumberOfElements() +
509 hash_table->NumberOfDeletedElements())) *
526 int wasted_value_slots_count = obj->number_of_slack_descriptors();
528 if (!obj->IsInitializedDescriptor(
i)) {
535 if (
IsAny(field_type)) {
536 ++wasted_value_slots_count;
539 if (wasted_value_slots_count == 0)
return;
540 int wasted_value_slots_size = wasted_value_slots_count *
kTaggedSize;
542 StatsEnum::WASTED_DESCRIPTOR_ARRAY_VALUES_TYPE, wasted_value_slots_size,
546 int wasted_details_space =
547 obj->number_of_all_descriptors() * (
kTaggedSize - 1);
549 StatsEnum::WASTED_DESCRIPTOR_ARRAY_DETAILS_TYPE, wasted_details_space,
580 if (!site->PointsToLiteral())
return;
582 if (IsJSArray(boilerplate)) {
584 StatsEnum::JS_ARRAY_BOILERPLATE_TYPE);
588 site, boilerplate, StatsEnum::JS_OBJECT_BOILERPLATE_TYPE,
590 if (boilerplate->HasFastProperties()) {
595 site, properties, StatsEnum::BOILERPLATE_PROPERTY_ARRAY_TYPE);
599 site, properties, StatsEnum::BOILERPLATE_PROPERTY_DICTIONARY_TYPE);
604 StatsEnum::BOILERPLATE_ELEMENTS_TYPE);
611 if (!IsUndefined(fti->GetInstanceCallHandler(), isolate())) {
614 StatsEnum::FUNCTION_TEMPLATE_INFO_ENTRIES_TYPE);
623 StatsEnum::GLOBAL_PROPERTIES_TYPE);
627 StatsEnum::GLOBAL_ELEMENTS_TYPE);
633 if (IsJSGlobalObject(
object))
return;
636 if (IsJSFunction(
object) &&
639 StatsEnum::JS_UNCOMPILED_FUNCTION_TYPE);
643 if (object->HasFastProperties()) {
646 size_t over_allocated =
647 object->map()->UnusedPropertyFields() *
kTaggedSize;
649 object->map()->is_prototype_map()
650 ? StatsEnum::PROTOTYPE_PROPERTY_ARRAY_TYPE
651 : StatsEnum::OBJECT_PROPERTY_ARRAY_TYPE,
652 properties->Size(), over_allocated);
658 object->map()->is_prototype_map()
659 ? StatsEnum::PROTOTYPE_PROPERTY_DICTIONARY_TYPE
660 : StatsEnum::OBJECT_PROPERTY_DICTIONARY_TYPE);
665 if (object->HasDictionaryElements()) {
668 IsJSArray(
object) ? StatsEnum::ARRAY_DICTIONARY_ELEMENTS_TYPE
669 : StatsEnum::OBJECT_DICTIONARY_ELEMENTS_TYPE);
670 }
else if (IsJSArray(
object)) {
672 size_t element_size =
675 size_t over_allocated = (elements->length() - length) * element_size;
677 elements->Size(), over_allocated);
681 StatsEnum::OBJECT_ELEMENTS_TYPE);
685 if (IsJSCollection(
object)) {
687 if (!IsUndefined(maybe_table,
isolate())) {
691 StatsEnum::JS_COLLECTION_TABLE_TYPE);
698 if (maybe_obj.
IsCleared())
return StatsEnum::FEEDBACK_VECTOR_SLOT_OTHER_TYPE;
702 if (obj == *isolate->factory()->uninitialized_symbol()) {
703 return StatsEnum::FEEDBACK_VECTOR_SLOT_CALL_UNUSED_TYPE;
705 return StatsEnum::FEEDBACK_VECTOR_SLOT_CALL_TYPE;
712 if (obj == *isolate->factory()->uninitialized_symbol()) {
713 return StatsEnum::FEEDBACK_VECTOR_SLOT_LOAD_UNUSED_TYPE;
715 return StatsEnum::FEEDBACK_VECTOR_SLOT_LOAD_TYPE;
724 if (obj == *isolate->factory()->uninitialized_symbol()) {
725 return StatsEnum::FEEDBACK_VECTOR_SLOT_STORE_UNUSED_TYPE;
727 return StatsEnum::FEEDBACK_VECTOR_SLOT_STORE_TYPE;
731 return StatsEnum::FEEDBACK_VECTOR_SLOT_ENUM_TYPE;
734 return StatsEnum::FEEDBACK_VECTOR_SLOT_OTHER_TYPE;
745 size_t calculated_size = 0;
748 size_t header_size = vector->slots_start().address() - vector.address();
751 calculated_size += header_size;
754 if (!vector->shared_function_info()->HasFeedbackMetadata())
return;
757 while (it.HasNext()) {
764 calculated_size += slot_size;
767 for (
int i = 0;
i < it.entry_size();
i++) {
774 StatsEnum::FEEDBACK_VECTOR_ENTRY_TYPE);
780 CHECK_EQ(calculated_size, vector->Size());
800 if (InstanceTypeChecker::IsFeedbackVector(instance_type)) {
802 }
else if (InstanceTypeChecker::IsMap(instance_type)) {
804 }
else if (InstanceTypeChecker::IsBytecodeArray(instance_type)) {
806 }
else if (InstanceTypeChecker::IsInstructionStream(instance_type)) {
808 }
else if (InstanceTypeChecker::IsFunctionTemplateInfo(instance_type)) {
811 }
else if (InstanceTypeChecker::IsJSGlobalObject(instance_type)) {
813 }
else if (InstanceTypeChecker::IsJSObject(instance_type)) {
817 }
else if (InstanceTypeChecker::IsSharedFunctionInfo(instance_type)) {
819 }
else if (InstanceTypeChecker::IsContext(instance_type)) {
821 }
else if (InstanceTypeChecker::IsScript(instance_type)) {
823 }
else if (InstanceTypeChecker::IsArrayBoilerplateDescription(
827 }
else if (InstanceTypeChecker::IsFixedArrayExact(instance_type)) {
839 }
else if (InstanceTypeChecker::IsJSObject(instance_type)) {
840 over_allocated = map->instance_size() - map->UsedInstanceSize();
845 if (recorded && InstanceTypeChecker::IsDescriptorArray(instance_type)) {
864 list = site->weak_next();
869 StatsEnum::SERIALIZED_OBJECTS_TYPE);
871 StatsEnum::NUMBER_STRING_CACHE_TYPE);
874 StatsEnum::SINGLE_CHARACTER_STRING_TABLE_TYPE);
876 StatsEnum::STRING_SPLIT_CACHE_TYPE);
878 StatsEnum::REGEXP_MULTIPLE_CACHE_TYPE);
883 StatsEnum::SCRIPT_LIST_TYPE);
888 size_t over_allocated) {
899 return array != roots.empty_fixed_array() &&
900 array != roots.empty_slow_element_dictionary() &&
901 array != roots.empty_property_dictionary();
911 const auto obj1_marked =
913 const auto obj2_marked =
915 return obj1_marked == obj2_marked;
925 if (map->is_prototype_map()) {
926 if (map->is_dictionary_map()) {
928 StatsEnum::MAP_PROTOTYPE_DICTIONARY_TYPE);
929 }
else if (map->is_abandoned_prototype_map()) {
931 StatsEnum::MAP_ABANDONED_PROTOTYPE_TYPE);
934 StatsEnum::MAP_PROTOTYPE_TYPE);
936 }
else if (map->is_deprecated()) {
938 StatsEnum::MAP_DEPRECATED_TYPE);
939 }
else if (map->is_dictionary_map()) {
941 StatsEnum::MAP_DICTIONARY_TYPE);
942 }
else if (map->is_stable()) {
944 StatsEnum::MAP_STABLE_TYPE);
950 if (map->owns_descriptors() &&
956 bool recorded =
false;
957 if (map->is_prototype_map()) {
959 map, array, StatsEnum::PROTOTYPE_DESCRIPTOR_ARRAY_TYPE);
961 }
else if (map->is_deprecated()) {
963 map, array, StatsEnum::DEPRECATED_DESCRIPTOR_ARRAY_TYPE);
973 StatsEnum::ENUM_KEYS_CACHE_TYPE);
975 StatsEnum::ENUM_INDICES_CACHE_TYPE);
978 if (map->is_prototype_map()) {
980 if (map->TryGetPrototypeInfo(&prototype_info)) {
982 if (IsWeakFixedArray(users,
cage_base())) {
984 StatsEnum::PROTOTYPE_USERS_TYPE);
993 StatsEnum::SCRIPT_INFOS_TYPE);
997 if (IsExternalString(raw_source,
cage_base())) {
1002 Address resource =
string->resource_as_address();
1003 size_t off_heap_size =
string->ExternalPayloadSize();
1006 string->IsOneByteRepresentation()
1007 ? StatsEnum::SCRIPT_SOURCE_EXTERNAL_ONE_BYTE_TYPE
1008 : StatsEnum::SCRIPT_SOURCE_EXTERNAL_TWO_BYTE_TYPE,
1010 }
else if (IsString(raw_source,
cage_base())) {
1014 source->IsOneByteRepresentation()
1015 ? StatsEnum::SCRIPT_SOURCE_NON_EXTERNAL_ONE_BYTE_TYPE
1016 : StatsEnum::SCRIPT_SOURCE_NON_EXTERNAL_TWO_BYTE_TYPE);
1024 Address resource =
string->resource_as_address();
1025 size_t off_heap_size =
string->ExternalPayloadSize();
1028 string->IsOneByteRepresentation()
1029 ? StatsEnum::STRING_EXTERNAL_RESOURCE_ONE_BYTE_TYPE
1030 : StatsEnum::STRING_EXTERNAL_RESOURCE_TWO_BYTE_TYPE,
1037 if (!info->is_compiled()) {
1039 HeapObject(), info, StatsEnum::UNCOMPILED_SHARED_FUNCTION_INFO_TYPE);
1046 description, description->constant_elements(),
1047 StatsEnum::ARRAY_BOILERPLATE_DESCRIPTION_ELEMENTS_TYPE);
1055 if (IsFixedArrayExact(
object,
cage_base())) {
1057 for (
int i = 0;
i < array->
length();
i++) {
1069 StatsEnum::BYTECODE_ARRAY_CONSTANT_POOL_TYPE);
1076 if (IsFixedArrayExact(entry)) {
1079 StatsEnum::EMBEDDED_OBJECT_TYPE);
1083 StatsEnum::BYTECODE_ARRAY_HANDLER_TABLE_TYPE);
1084 if (bytecode->HasSourcePositionTable()) {
1086 StatsEnum::SOURCE_POSITION_TABLE_TYPE);
1094#define CODE_KIND_CASE(type) \
1095 case CodeKind::type: \
1096 return StatsEnum::type;
1098#undef CODE_KIND_CASE
1110 CodeKindToVirtualInstanceType(code->kind()));
1112 StatsEnum::RELOC_INFO_TYPE);
1114 Tagged<Object> source_position_table = code->source_position_table();
1118 StatsEnum::SOURCE_POSITION_TABLE_TYPE);
1121 StatsEnum::DEOPTIMIZATION_DATA_TYPE);
1124 if (input_data->length() > 0) {
1126 input_data->LiteralArray(),
1127 StatsEnum::OPTIMIZED_CODE_LITERALS_TYPE);
1134 if (IsFixedArrayExact(target,
cage_base())) {
1142 if (IsNativeContext(context)) {
1144 if (IsWeakArrayList(context->retained_maps(),
cage_base())) {
1147 StatsEnum::RETAINED_MAPS_TYPE);
1150 }
else if (context->IsFunctionContext()) {
1154 StatsEnum::OTHER_CONTEXT_TYPE);
1195 obj = iterator.
Next()) {
1196 visitor->
Visit(obj);
1209 IterateHeap(
heap_, &visitor);
Tagged< HeapObject > Next()
FeedbackSlot WithOffset(int offset) const
static FieldIndex ForDetails(Tagged< Map > map, PropertyDetails details)
size_t *const string_data_count_
size_t *const inobject_smi_fields_count_
void RecordStats(Tagged< HeapObject > host)
void VisitPointers(Tagged< HeapObject > host, MaybeObjectSlot start, MaybeObjectSlot end) override
std::unordered_map< Tagged< Map >, JSObjectFieldStats, Object::Hasher > field_stats_cache_
size_t *const embedder_fields_count_
size_t *const tagged_fields_count_
void VisitMapPointer(Tagged< HeapObject > host) override
FieldStatsCollector(Heap *heap, size_t *tagged_fields_count, size_t *embedder_fields_count, size_t *inobject_smi_fields_count, size_t *boxed_double_fields_count, size_t *string_data_count, size_t *raw_fields_count)
V8_INLINE void VisitInstructionStreamPointer(Tagged< Code > host, InstructionStreamSlot slot) override
size_t *const boxed_double_fields_count_
void VisitEmbeddedPointer(Tagged< InstructionStream > host, RelocInfo *rinfo) override
JSObjectFieldStats GetInobjectFieldStats(Tagged< Map > map)
void VisitPointers(Tagged< HeapObject > host, ObjectSlot start, ObjectSlot end) override
size_t *const raw_fields_count_
void VisitCodeTarget(Tagged< InstructionStream > host, RelocInfo *rinfo) override
static constexpr int kHeaderSize
V8_INLINE Tagged< FixedArray > single_character_string_table()
Tagged< UnionOf< Smi, Undefined, AllocationSiteWithWeakNext > > allocation_sites_list()
Isolate * isolate() const
double time_millis_since_init() const
int GetEmbedderFieldCount() const
NonAtomicMarkingState *const marking_state_
void RecordVirtualExternalStringDetails(Tagged< ExternalString > script)
void RecordVirtualFixedArrayDetails(Tagged< FixedArray > array)
void RecordVirtualJSGlobalObjectDetails(Tagged< JSGlobalObject > object)
bool SameLiveness(Tagged< HeapObject > obj1, Tagged< HeapObject > obj2)
void RecordExternalResourceStats(Address resource, ObjectStats::VirtualInstanceType type, size_t size)
bool IsCowArray(Tagged< FixedArrayBase > array)
ObjectStatsCollectorImpl(Heap *heap, ObjectStats *stats)
void CollectGlobalStatistics()
std::unordered_set< Tagged< HeapObject >, Object::Hasher, Object::KeyEqualSafe > virtual_objects_
void RecordHashTableVirtualObjectStats(Tagged< HeapObject > parent, Tagged< Dictionary > hash_table, ObjectStats::VirtualInstanceType type)
static const int kNumberOfPhases
void RecordVirtualBytecodeArrayDetails(Tagged< BytecodeArray > bytecode)
void RecordVirtualSharedFunctionInfoDetails(Tagged< SharedFunctionInfo > info)
bool RecordSimpleVirtualObjectStats(Tagged< HeapObject > parent, Tagged< HeapObject > obj, ObjectStats::VirtualInstanceType type)
bool RecordVirtualObjectStats(Tagged< HeapObject > parent, Tagged< HeapObject > obj, ObjectStats::VirtualInstanceType type, size_t size, size_t over_allocated, CowMode check_cow_array=kCheckCow)
bool CanRecordFixedArray(Tagged< FixedArrayBase > array)
bool ShouldRecordObject(Tagged< HeapObject > object, CowMode check_cow_array)
void RecordVirtualScriptDetails(Tagged< Script > script)
void RecordVirtualContext(Tagged< Context > context)
void RecordVirtualJSObjectDetails(Tagged< JSObject > object)
void RecordVirtualObjectsForConstantPoolOrEmbeddedObjects(Tagged< HeapObject > parent, Tagged< HeapObject > object, ObjectStats::VirtualInstanceType type)
void RecordPotentialDescriptorArraySavingsStats(Tagged< DescriptorArray > obj)
void RecordVirtualAllocationSiteDetails(Tagged< AllocationSite > site)
void CollectStatistics(Tagged< HeapObject > obj, Phase phase, CollectFieldStats collect_field_stats)
void RecordVirtualFunctionTemplateInfoDetails(Tagged< FunctionTemplateInfo > fti)
FieldStatsCollector field_stats_collector_
void RecordVirtualCodeDetails(Tagged< InstructionStream > code)
std::unordered_set< Address > external_resources_
void RecordVirtualMapDetails(Tagged< Map > map)
void RecordVirtualFeedbackVectorDetails(Tagged< FeedbackVector > vector)
PtrComprCageBase cage_base() const
void RecordVirtualArrayBoilerplateDescription(Tagged< ArrayBoilerplateDescription > description)
ObjectStats *const stats_
bool RecordObjectStats(Tagged< HeapObject > obj, InstanceType type, size_t size, size_t over_allocated=ObjectStats::kNoOverAllocation)
ObjectStatsCollectorImpl::Phase phase_
ObjectStatsVisitor(Heap *heap, ObjectStatsCollectorImpl *live_collector, ObjectStatsCollectorImpl *dead_collector, ObjectStatsCollectorImpl::Phase phase)
void Visit(Tagged< HeapObject > obj)
ObjectStatsCollectorImpl *const dead_collector_
ObjectStatsCollectorImpl *const live_collector_
NonAtomicMarkingState *const marking_state_
static const int kNumberOfBuckets
void CheckpointObjectStats()
size_t object_sizes_last_time_[OBJECT_STATS_COUNT]
size_t over_allocated_histogram_[OBJECT_STATS_COUNT][kNumberOfBuckets]
size_t object_counts_last_time_[OBJECT_STATS_COUNT]
V8_NOINLINE void DumpInstanceTypeData(std::stringstream &stream, const char *name, int index)
void RecordVirtualObjectStats(VirtualInstanceType type, size_t size, size_t over_allocated)
size_t over_allocated_[OBJECT_STATS_COUNT]
int HistogramIndexFromSize(size_t size)
void PrintKeyAndId(const char *key, int gc_count)
void PrintJSON(const char *key)
void Dump(std::stringstream &stream)
void RecordObjectStats(InstanceType type, size_t size, size_t over_allocated=kNoOverAllocation)
static const int kFirstBucketShift
size_t inobject_smi_fields_count_
size_t size_histogram_[OBJECT_STATS_COUNT][kNumberOfBuckets]
V8_NOINLINE void PrintInstanceTypeJSON(const char *key, int gc_count, const char *name, int index)
size_t embedder_fields_count_
size_t object_sizes_[OBJECT_STATS_COUNT]
static const int kLastValueBucketIndex
size_t object_counts_[OBJECT_STATS_COUNT]
void ClearObjectStats(bool clear_last_time_stats=false)
static const size_t kNoOverAllocation
size_t string_data_count_
size_t tagged_fields_count_
size_t boxed_double_fields_count_
static constexpr int FIRST_VIRTUAL_TYPE
PtrComprCageBase cage_base() const
static double NumberValue(Tagged< Number > obj)
PropertyLocation location() const
Representation representation() const
static constexpr bool IsEmbeddedObjectMode(Mode mode)
static int EmbeddedObjectModeMask()
constexpr bool IsSmi() const
constexpr bool SafeEquals(TaggedImpl< kOtherRefType, StorageType > other) const
constexpr bool IsCleared() const
bool GetHeapObject(Tagged< HeapObject > *result) const
Tagged< Object > GetHeapObjectOrSmi() const
V8_INLINE constexpr bool is_null() const
#define CODE_KIND_LIST(V)
NonAtomicMarkingState * marking_state_
#define LAZY_MUTEX_INITIALIZER
constexpr unsigned CountLeadingZeros(T value)
V8_INLINE constexpr bool IsExternalString(InstanceType instance_type)
bool TryCast(Tagged< From > value, Tagged< To > *out)
constexpr int kTaggedSize
constexpr bool CodeKindIsOptimizedJSFunction(CodeKind kind)
static ObjectStats::VirtualInstanceType GetFeedbackSlotType(Tagged< MaybeObject > maybe_obj, FeedbackSlotKind kind, Isolate *isolate)
static V8_NOINLINE void PrintJSONArray(size_t *array, const int len)
void PrintF(const char *format,...)
constexpr int kEmbedderDataSlotSize
@ kLoadGlobalNotInsideTypeof
@ kLoadGlobalInsideTypeof
void VisitObject(Isolate *isolate, Tagged< HeapObject > object, ObjectVisitor *visitor)
return Cast< NumberDictionary >(elements(cage_base))
constexpr int kSystemPointerSize
V8_INLINE constexpr bool IsHeapObject(TaggedImpl< kRefType, StorageType > obj)
bool IsAny(Tagged< FieldType > obj)
static const int kDescriptorIndexBitCount
constexpr int kDoubleSize
void MemCopy(void *dest, const void *src, size_t size)
static V8_NOINLINE void DumpJSONArray(std::stringstream &stream, size_t *array, const int len)
static base::LazyMutex object_stats_mutex
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
static constexpr AcquireLoadTag kAcquireLoad
#define CODE_KIND_CASE(type)
#define VIRTUAL_INSTANCE_TYPE_WRAPPER(name)
#define INSTANCE_TYPE_WRAPPER(name)
#define VIRTUAL_INSTANCE_TYPE_LIST(V)
#define INSTANCE_TYPE_LIST(V)
#define DCHECK_LE(v1, v2)
#define CHECK_LT(lhs, rhs)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define DCHECK_GT(v1, v2)
unsigned embedded_fields_count_
unsigned smi_fields_count_
static V8_INLINE bool IsMarkedOrAlwaysLive(Heap *heap, MarkingStateT *marking_state, Tagged< HeapObject > object)