v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
objects-body-descriptors-inl.h
Go to the documentation of this file.
1// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_OBJECTS_OBJECTS_BODY_DESCRIPTORS_INL_H_
6#define V8_OBJECTS_OBJECTS_BODY_DESCRIPTORS_INL_H_
7
9// Include the non-inl header before the rest of the headers.
10
11#include <algorithm>
12
13#include "include/v8-internal.h"
14#include "src/base/logging.h"
16#include "src/common/globals.h"
20#include "src/objects/bigint.h"
23#include "src/objects/cell.h"
50
51#if V8_ENABLE_WEBASSEMBLY
53#endif // V8_ENABLE_WEBASSEMBLY
54
55namespace v8 {
56namespace internal {
57
58template <int start_offset>
60 Tagged<HeapObject> object) {
61 return object->SizeFromMap(map);
62}
63
64template <int start_offset>
66 Tagged<Map> map, Tagged<HeapObject> object) {
67 return object->SizeFromMap(map);
68}
69
70template <typename ObjectVisitor>
73 int start_offset,
74 int end_offset,
75 ObjectVisitor* v) {
76#ifdef V8_COMPRESS_POINTERS
77 static_assert(kEmbedderDataSlotSize == 2 * kTaggedSize);
78 int header_end_offset = JSObject::GetHeaderSize(map);
79 int inobject_fields_start_offset = map->GetInObjectPropertyOffset(0);
80 // We are always requested to process header and embedder fields.
81 DCHECK_LE(inobject_fields_start_offset, end_offset);
82 // Embedder fields are located between header and inobject properties.
83 if (header_end_offset < inobject_fields_start_offset) {
84 // There are embedder fields.
86 IteratePointers(obj, start_offset, header_end_offset, v);
87 for (int offset = header_end_offset; offset < inobject_fields_start_offset;
91 obj, obj->RawExternalPointerField(
94 }
95 // Proceed processing inobject properties.
96 start_offset = inobject_fields_start_offset;
97 }
98#else
99 // We store raw aligned pointers as Smis, so it's safe to iterate the whole
100 // embedder field area as tagged slots.
101 static_assert(kEmbedderDataSlotSize == kTaggedSize);
102#endif
103 IteratePointers(obj, start_offset, end_offset, v);
104}
105
106template <typename ObjectVisitor>
107// static
109 Tagged<Map> map, Tagged<HeapObject> obj, int start_offset, int end_offset,
110 ObjectVisitor* v) {
111 // This body iteration assumes that there's no embedder fields.
113 UncheckedCast<JSObject>(obj)->GetEmbedderFieldCount(map) == 0);
114 IteratePointers(obj, start_offset, end_offset, v);
115}
116
117// This is a BodyDescriptor helper for usage within JSAPIObjectWithEmbedderSlots
118// and JSSpecialObject. The class hierarchies are separate but
119// `kCppHeapWrappableOffset` is the same for both.
121 : public BodyDescriptorBase {
122 public:
123 template <typename ObjectVisitor>
125 Tagged<Map> map, Tagged<HeapObject> obj, int object_size,
126 ObjectVisitor* v) {
127 // Visit JSObject header.
128 IteratePointers(obj, JSObject::kPropertiesOrHashOffset,
129 JSObject::kEndOfStrongFieldsOffset, v);
130
131 // Visit JSAPIObjectWithEmbedderSlots or JSSpecialObject header.
132 static_assert(JSObject::kEndOfStrongFieldsOffset ==
133 JSAPIObjectWithEmbedderSlots::kCppHeapWrappableOffset);
134 static_assert(JSAPIObjectWithEmbedderSlots::kCppHeapWrappableOffset ==
135 JSSpecialObject::kCppHeapWrappableOffset);
136 static_assert(JSAPIObjectWithEmbedderSlots::kCppHeapWrappableOffsetEnd +
137 1 ==
138 JSAPIObjectWithEmbedderSlots::kHeaderSize);
140 obj, obj->RawCppHeapPointerField(
141 JSAPIObjectWithEmbedderSlots::kCppHeapWrappableOffset));
142 }
143
144 template <typename ConcreteType, typename ObjectVisitor>
146 Tagged<Map> map, Tagged<HeapObject> obj, int object_size,
147 ObjectVisitor* v) {
148 // Visit the tail of JSObject with possible embedder fields and in-object
149 // properties. Note that embedder fields are processed in the JSObject base
150 // class as there's other object hierarchies that contain embedder fields as
151 // well.
152 IterateJSObjectBodyImpl(map, obj, ConcreteType::kHeaderSize, object_size,
153 v);
154 }
155
156 template <typename ConcreteType, typename ObjectVisitor>
158 Tagged<Map> map, Tagged<HeapObject> obj, int object_size,
159 ObjectVisitor* v) {
161 map, obj, ConcreteType::kHeaderSize, object_size, v);
162 }
163
164 static constexpr int kHeaderSize = JSSpecialObject::kHeaderSize;
165
166 static_assert(JSAPIObjectWithEmbedderSlots::kHeaderSize ==
167 JSSpecialObject::kHeaderSize);
169 JSSpecialObject::kHeaderSize);
170};
171
174 public:
175 template <typename ObjectVisitor>
176 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
177 int object_size, ObjectVisitor* v) {
178 IterateJSAPIObjectWithEmbedderSlotsHeader(map, obj, object_size, v);
181 map, obj, object_size, v);
182 }
183
184 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
185 return map->instance_size();
187};
188
189template <typename ObjectVisitor>
191 Tagged<HeapObject> obj, int start_offset, int end_offset,
192 ObjectVisitor* v) {
193 if (start_offset == HeapObject::kMapOffset) {
194 v->VisitMapPointer(obj);
195 start_offset += kTaggedSize;
196 }
197 v->VisitPointers(obj, obj->RawField(start_offset), obj->RawField(end_offset));
198}
199
200template <typename ObjectVisitor>
206
207template <typename ObjectVisitor>
209 Tagged<HeapObject> obj, int start_offset, int end_offset,
210 ObjectVisitor* v) {
211 v->VisitPointers(obj, obj->RawMaybeWeakField(start_offset),
212 obj->RawMaybeWeakField(end_offset));
213}
214
215template <typename ObjectVisitor>
221
222template <typename ObjectVisitor>
224 Tagged<HeapObject> obj, int start_offset, int end_offset,
225 ObjectVisitor* v) {
226 v->VisitCustomWeakPointers(obj, obj->RawField(start_offset),
227 obj->RawField(end_offset));
228}
229
230template <typename ObjectVisitor>
232 Tagged<HeapObject> obj, int index, int key_offset, int value_offset,
233 ObjectVisitor* v) {
234 v->VisitEphemeron(obj, index, obj->RawField(key_offset),
235 obj->RawField(value_offset));
236}
237
238template <typename ObjectVisitor>
244
245template <typename ObjectVisitor>
247 int offset, ObjectVisitor* v,
249 IndirectPointerTag tag) {
250#ifdef V8_ENABLE_SANDBOX
251 v->VisitIndirectPointer(obj, obj->RawIndirectPointerField(offset, tag), mode);
252#else
253 if (mode == IndirectPointerMode::kStrong) {
254 IteratePointer(obj, offset, v);
255 } else {
257 }
258#endif
259}
260
261template <typename ObjectVisitor>
263 ObjectVisitor* v,
264 IndirectPointerMode mode) {
265 IterateTrustedPointer(obj, offset, v, mode, kCodeIndirectPointerTag);
266}
267
268template <typename ObjectVisitor>
271 ObjectVisitor* v) {
272#ifdef V8_ENABLE_SANDBOX
274 obj, obj->RawIndirectPointerField(
275 ExposedTrustedObject::kSelfIndirectPointerOffset, tag));
276#endif
277}
278
279template <typename ObjectVisitor>
281 int offset, ObjectVisitor* v) {
282 DCHECK(IsTrustedObject(obj));
284 v->VisitProtectedPointer(host, host->RawProtectedPointerField(offset));
285}
286
287#ifdef V8_ENABLE_LEAPTIERING
288template <typename ObjectVisitor>
289void BodyDescriptorBase::IterateJSDispatchEntry(Tagged<HeapObject> obj,
290 int offset, ObjectVisitor* v) {
292 obj->Relaxed_ReadField<JSDispatchHandle::underlying_type>(offset));
294}
295#endif // V8_ENABLE_LEAPTIERING
296
298 public:
299 static constexpr int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
300 return sizeof(HeapNumber);
301 }
302};
303
304// This is a descriptor for one/two pointer fillers.
306 public:
307 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> raw_object) {
308 return map->instance_size();
309 }
310};
311
313 public:
314 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> raw_object) {
315 return UncheckedCast<FreeSpace>(raw_object)->Size();
316 }
317};
318
320 public:
321 static const int kStartOffset = JSReceiver::kPropertiesOrHashOffset;
322
323 template <typename ObjectVisitor>
324 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
325 int object_size, ObjectVisitor* v) {
326 IterateJSObjectBodyImpl(map, obj, kStartOffset, object_size, v);
327 }
328
329 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
330 return map->instance_size();
331 }
332};
333
335 public:
336 static const int kStartOffset = JSReceiver::kPropertiesOrHashOffset;
337
338 template <typename ObjectVisitor>
339 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
340 int object_size, ObjectVisitor* v) {
341 IteratePointers(obj, kStartOffset, object_size, v);
342 }
343
344 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
345 return map->instance_size();
346 }
347};
348
350 public:
351 template <typename ObjectVisitor>
352 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
353 int object_size, ObjectVisitor* v) {
355 JSDate::kValueOffset, v);
356 IterateJSObjectBodyImpl(map, obj, JSDate::kStartOfStrongFieldsOffset,
357 object_size, v);
358 }
359
360 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
361 return map->instance_size();
362 }
363};
364
366 public:
367 static const int kStartOffset = JSReceiver::kPropertiesOrHashOffset;
368
369 template <typename ObjectVisitor>
370 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
371 int object_size, ObjectVisitor* v) {
372 IteratePointers(obj, kPropertiesOrHashOffset, JSObject::kHeaderSize, v);
374 kRegExpDataIndirectPointerTag);
375 IteratePointer(obj, kSourceOffset, v);
376 IterateJSObjectBodyImpl(map, obj, kHeaderSize, object_size, v);
377 }
378
379 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
380 return map->instance_size();
381 }
382};
383
385 public:
386 template <typename ObjectVisitor>
387 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
388 int object_size, ObjectVisitor* v) {
389 // If new pointers are added to RegExpData, make sure to also add them to
390 // the subclasses descriptors (AtomRegExpData and IrRegExpData).
391 // We don't directly call the base class IterateBody, as in the future
392 // the subclasses will have a different indirect pointer tag from the base
393 // class (once inheritance hierarchies are supported for indirect pointer
394 // tags).
395 IterateSelfIndirectPointer(obj, kRegExpDataIndirectPointerTag, v);
396 IteratePointer(obj, kSourceOffset, v);
397 IteratePointer(obj, kWrapperOffset, v);
398 }
399
400 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> obj) {
401 return kSize;
402 }
403};
404
406 public:
407 template <typename ObjectVisitor>
408 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
409 int object_size, ObjectVisitor* v) {
410 IterateSelfIndirectPointer(obj, kRegExpDataIndirectPointerTag, v);
411
412 IteratePointer(obj, kSourceOffset, v);
413 IteratePointer(obj, kWrapperOffset, v);
414
415 IteratePointer(obj, kPatternOffset, v);
416 }
417
418 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> obj) {
419 return kSize;
420 }
421};
422
424 public:
425 template <typename ObjectVisitor>
426 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
427 int object_size, ObjectVisitor* v) {
428 IterateSelfIndirectPointer(obj, kRegExpDataIndirectPointerTag, v);
429
430 IteratePointer(obj, kSourceOffset, v);
431 IteratePointer(obj, kWrapperOffset, v);
432
433 IterateProtectedPointer(obj, kLatin1BytecodeOffset, v);
434 IterateProtectedPointer(obj, kUc16BytecodeOffset, v);
435 IterateCodePointer(obj, kLatin1CodeOffset, v, IndirectPointerMode::kStrong);
436 IterateCodePointer(obj, kUc16CodeOffset, v, IndirectPointerMode::kStrong);
437 IteratePointer(obj, kCaptureNameMapOffset, v);
438 }
439
440 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> obj) {
441 return kSize;
442 }
443};
444
446 public:
447 template <typename ObjectVisitor>
448 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
449 int object_size, ObjectVisitor* v) {
451 kRegExpDataIndirectPointerTag);
452 }
453
454 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> obj) {
455 return kSize;
456 }
457};
458
460 public:
461 template <typename ObjectVisitor>
462 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
463 int object_size, ObjectVisitor* v) {
464 IteratePointers(obj, HeapObject::kHeaderSize, kTargetOffset, v);
465 IterateCustomWeakPointer(obj, kTargetOffset, v);
466 IterateCustomWeakPointer(obj, kUnregisterTokenOffset, v);
467 IteratePointers(obj, kUnregisterTokenOffset + kTaggedSize, object_size, v);
468 }
469
470 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
471 return map->instance_size();
472 }
473};
474
476 public:
477 template <typename ObjectVisitor>
478 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
479 int object_size, ObjectVisitor* v) {
480 IteratePointers(obj, JSReceiver::kPropertiesOrHashOffset, kTargetOffset, v);
481 IterateCustomWeakPointer(obj, kTargetOffset, v);
482 IterateJSObjectBodyImpl(map, obj, kTargetOffset + kTaggedSize, object_size,
483 v);
484 }
485
486 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
487 return map->instance_size();
488 }
489};
490
492 public:
493 template <typename ObjectVisitor>
494 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
495 int object_size, ObjectVisitor* v) {
497 kNextDirtyOffset, v);
498 IterateCustomWeakPointer(obj, kNextDirtyOffset, v);
499 IterateJSObjectBodyImpl(map, obj, kNextDirtyOffset + kTaggedSize,
500 object_size, v);
501 }
502
503 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
504 return map->instance_size();
505 }
506};
507
509 public:
510 static constexpr int kCommonPointerFieldsStart = sizeof(HeapObjectLayout);
511 static constexpr int kCommonPointerFieldsEnd =
513
514 static_assert(kCommonPointerFieldsEnd ==
516 static_assert(offsetof(AllocationSite, pretenure_data_) + kInt32Size ==
518 static_assert(offsetof(AllocationSite, pretenure_create_count_) +
519 kInt32Size ==
520 offsetof(AllocationSiteWithWeakNext, weak_next_));
521
522 template <typename ObjectVisitor>
523 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
524 int object_size, ObjectVisitor* v) {
525 // Iterate over all the common pointer fields
527 // Skip PretenureDataOffset and PretenureCreateCount which are Int32 fields.
528 // Visit weak_next only if it has weak_next field.
529 if (object_size == sizeof(AllocationSiteWithWeakNext)) {
531 obj, offsetof(AllocationSiteWithWeakNext, weak_next_),
532 sizeof(AllocationSiteWithWeakNext), v);
533 }
534 }
535
536 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
537 return map->instance_size();
538 }
539};
540
542 public:
544#ifdef V8_ENABLE_LEAPTIERING
545 static const int kCodeFieldOffset = JSFunction::kDispatchHandleOffset;
546#else
547 static const int kCodeFieldOffset = JSFunction::kCodeOffset;
548#endif
549
550 template <typename ObjectVisitor>
551 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
552 int object_size, ObjectVisitor* v) {
553 // Iterate JSFunction header fields first.
554 int header_size = JSFunction::GetHeaderSize(map->has_prototype_slot());
555 DCHECK_GE(object_size, header_size);
557
558#ifdef V8_ENABLE_LEAPTIERING
559 IterateJSDispatchEntry(obj, kDispatchHandleOffset, v);
560#else
561 // The code field is treated as a custom weak pointer. This field
562 // is visited as a weak pointer if the Code is baseline code
563 // and the bytecode array corresponding to this function is old. In the rest
564 // of the cases this field is treated as strong pointer.
565 // See MarkingVisitorBase::VisitJSFunction.
567 DCHECK_GE(header_size, kCodeOffset);
568#endif // V8_ENABLE_LEAPTIERING
569
570 // Iterate rest of the header fields
571 IteratePointers(obj, kCodeFieldOffset + kTaggedSize, header_size, v);
572 // Iterate rest of the fields starting after the header.
573 IterateJSObjectBodyImpl(map, obj, header_size, object_size, v);
574 }
575
576 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
577 return map->instance_size();
578 }
579};
580
583 public:
585
586 template <typename ObjectVisitor>
587 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
588 int object_size, ObjectVisitor* v) {
589 // JSObject with wrapper field.
590 IterateJSAPIObjectWithEmbedderSlotsHeader(map, obj, object_size, v);
591 // JSArrayBuffer.
592 IteratePointers(obj, JSArrayBuffer::kStartOfStrongFieldsOffset,
593 JSArrayBuffer::kEndOfStrongFieldsOffset, v);
595 obj, obj->RawExternalPointerField(JSArrayBuffer::kExtensionOffset,
597 // JSObject tail: possible embedder fields + in-object properties.
600 object_size, v);
601 } else {
603 object_size, v);
604 }
605 }
606
607 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
608 return map->instance_size();
609 }
610};
611
614 public:
616
617 template <typename ObjectVisitor>
618 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
619 int object_size, ObjectVisitor* v) {
620 // JSObject with wrapper field.
621 IterateJSAPIObjectWithEmbedderSlotsHeader(map, obj, object_size, v);
622 // JSArrayBufferView.
623 IteratePointers(obj, JSArrayBufferView::kStartOfStrongFieldsOffset,
624 JSArrayBufferView::kEndOfStrongFieldsOffset, v);
625 }
626};
627
629 public:
631
632 template <typename ObjectVisitor>
633 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
634 int object_size, ObjectVisitor* v) {
635 // JSArrayBufferView (including JSObject).
636 Base::IterateBody(map, obj, object_size, v);
637 // JSTypedArray.
638 IteratePointers(obj, JSTypedArray::kStartOfStrongFieldsOffset,
639 JSTypedArray::kEndOfStrongFieldsOffset, v);
640
641 // JSObject tail: possible embedder fields + in-object properties.
644 object_size, v);
645 } else {
647 object_size, v);
648 }
649 }
650
651 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
652 return map->instance_size();
653 }
654};
655
658 public:
660
661 template <typename ObjectVisitor>
662 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
663 int object_size, ObjectVisitor* v) {
664 // JSArrayBufferView (including JSObject).
665 Base::IterateBody(map, obj, object_size, v);
666 // JSDataViewOrRabGsabDataView.
667 IteratePointers(obj,
668 JSDataViewOrRabGsabDataView::kStartOfStrongFieldsOffset,
669 JSDataViewOrRabGsabDataView::kEndOfStrongFieldsOffset, v);
670 // JSObject tail: possible embedder fields + in-object properties.
673 map, obj, object_size, v);
674 } else {
676 map, obj, object_size, v);
677 }
678 }
679
680 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
681 return map->instance_size();
682 }
683};
684
686 public:
687 template <typename ObjectVisitor>
688 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
689 int object_size, ObjectVisitor* v) {
690 DCHECK_EQ(0, map->GetInObjectProperties());
691 IteratePointers(obj, kPropertiesOrHashOffset, kEndOfTaggedFieldsOffset, v);
692 v->VisitExternalPointer(obj, obj->RawExternalPointerField(
693 kValueOffset, kExternalObjectValueTag));
694 }
695
696 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
697 return map->instance_size();
698 }
699};
700
701template <typename Derived>
702class V8_EXPORT_PRIVATE SmallOrderedHashTable<Derived>::BodyDescriptor final
703 : public BodyDescriptorBase {
704 public:
705 template <typename ObjectVisitor>
706 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
707 int object_size, ObjectVisitor* v) {
708 Tagged<Derived> table = Cast<Derived>(obj);
709 int start_offset = DataTableStartOffset();
710 int end_offset = table->GetBucketsStartOffset();
711 IteratePointers(obj, start_offset, end_offset, v);
712 }
713
714 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> obj) {
715 Tagged<Derived> table = Cast<Derived>(obj);
716 return Derived::SizeFor(table->Capacity());
717 }
718};
719
721 : public BodyDescriptorBase {
722 public:
723 template <typename ObjectVisitor>
724 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
725 int object_size, ObjectVisitor* v) {
726 Tagged<SwissNameDictionary> table = UncheckedCast<SwissNameDictionary>(obj);
727 static_assert(MetaTablePointerOffset() + kTaggedSize ==
728 DataTableStartOffset());
729 int start_offset = MetaTablePointerOffset();
730 int end_offset = table->DataTableEndOffset(table->Capacity());
731 IteratePointers(obj, start_offset, end_offset, v);
732 }
733
734 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> obj) {
735 Tagged<SwissNameDictionary> table = UncheckedCast<SwissNameDictionary>(obj);
736 return SwissNameDictionary::SizeFor(table->Capacity());
737 }
738};
739
741 public:
742 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> obj) {
743 return UncheckedCast<ByteArray>(obj)->AllocatedSize();
744 }
745};
746
748 public:
749 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> obj) {
750 return UncheckedCast<TrustedByteArray>(obj)->AllocatedSize();
751 }
752};
753
755 public:
756 template <typename ObjectVisitor>
757 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
758 int object_size, ObjectVisitor* v) {
759 IterateSelfIndirectPointer(obj, kBytecodeArrayIndirectPointerTag, v);
760 IteratePointer(obj, kWrapperOffset, v);
761 IterateProtectedPointer(obj, kSourcePositionTableOffset, v);
762 IterateProtectedPointer(obj, kHandlerTableOffset, v);
763 IterateProtectedPointer(obj, kConstantPoolOffset, v);
764 }
765
766 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> obj) {
769 }
770};
771
773 public:
774 template <typename ObjectVisitor>
775 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
776 int object_size, ObjectVisitor* v) {
778 kBytecodeArrayIndirectPointerTag);
779 }
780
781 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> obj) {
782 return kSize;
783 }
784};
785
787 public:
788 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> obj) {
790 }
791};
792
794 public:
795 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> obj) {
796 return UncheckedCast<FixedDoubleArray>(obj)->AllocatedSize();
797 }
798};
799
801 public:
802 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> obj) {
803 return UncheckedCast<FeedbackMetadata>(obj)->AllocatedSize();
804 }
805};
806
808 public:
809 template <typename ObjectVisitor>
810 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
811 int object_size, ObjectVisitor* v) {
813 int start_offset = data->inner_start_offset();
814 int end_offset = start_offset + data->children_length() * kTaggedSize;
815 IteratePointers(obj, start_offset, end_offset, v);
816 }
817
818 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> obj) {
820 return PreparseData::SizeFor(data->data_length(), data->children_length());
821 }
822};
823
825 public:
826 template <typename ObjectVisitor>
827 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
828 int object_size, ObjectVisitor* v) {
829 IterateSelfIndirectPointer(obj, kInterpreterDataIndirectPointerTag, v);
830 IterateProtectedPointer(obj, kBytecodeArrayOffset, v);
831 IterateProtectedPointer(obj, kInterpreterTrampolineOffset, v);
832 }
833
834 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> raw_object) {
835 return kSize;
836 }
837};
838
840 : public BodyDescriptorBase {
841 public:
842 template <typename ObjectVisitor>
843 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
844 int object_size, ObjectVisitor* v) {
845 IterateSelfIndirectPointer(obj, kUncompiledDataIndirectPointerTag, v);
846 IteratePointer(obj, kInferredNameOffset, v);
847 }
848
849 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> raw_object) {
850 return kSize;
851 }
852};
853
855 : public BodyDescriptorBase {
856 public:
857 template <typename ObjectVisitor>
858 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
859 int object_size, ObjectVisitor* v) {
860 IterateSelfIndirectPointer(obj, kUncompiledDataIndirectPointerTag, v);
861 IteratePointer(obj, kInferredNameOffset, v);
862 IteratePointer(obj, kPreparseDataOffset, v);
863 }
864
865 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> raw_object) {
866 return kSize;
867 }
868};
869
871 : public BodyDescriptorBase {
872 public:
873 template <typename ObjectVisitor>
874 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
875 int object_size, ObjectVisitor* v) {
876 IterateSelfIndirectPointer(obj, kUncompiledDataIndirectPointerTag, v);
877 IteratePointer(obj, kInferredNameOffset, v);
878 }
879
880 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> raw_object) {
881 return kSize;
882 }
883};
884
886 : public BodyDescriptorBase {
887 public:
888 template <typename ObjectVisitor>
889 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
890 int object_size, ObjectVisitor* v) {
891 IterateSelfIndirectPointer(obj, kUncompiledDataIndirectPointerTag, v);
892 IteratePointer(obj, kInferredNameOffset, v);
893 IteratePointer(obj, kPreparseDataOffset, v);
894 }
895
896 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> raw_object) {
897 return kSize;
898 }
899};
900
902 public:
903 template <typename ObjectVisitor>
904 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
905 int object_size, ObjectVisitor* v) {
906 IterateTrustedPointer(obj, kTrustedFunctionDataOffset, v,
909 IteratePointers(obj, kStartOfStrongFieldsOffset, kEndOfStrongFieldsOffset,
910 v);
911 }
912
913 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> raw_object) {
914 return kSize;
915 }
916};
917
919 : public BodyDescriptorBase {
920 public:
921 template <typename ObjectVisitor>
922 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
923 int object_size, ObjectVisitor* v) {
924 IteratePointer(obj, kSharedInfoOffset, v);
925 }
926
927 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> raw_object) {
928 return kSize;
929 }
930};
931
933 public:
934 template <typename ObjectVisitor>
935 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
936 int object_size, ObjectVisitor* v) {
937 IteratePointers(obj, kStartOfStrongFieldsOffset, kEndOfStrongFieldsOffset,
938 v);
939 IterateTrustedPointer(obj, kDebugBytecodeArrayOffset, v,
941 kBytecodeArrayIndirectPointerTag);
944 kBytecodeArrayIndirectPointerTag);
945 }
946
947 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> obj) {
948 return obj->SizeFromMap(map);
949 }
950};
951
953 public:
954 template <typename ObjectVisitor>
955 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
956 int object_size, ObjectVisitor* v) {
957 // The field can contain either a Code or a BytecodeArray object, so we need
958 // to use the kUnknownIndirectPointerTag here.
959 IterateTrustedPointer(obj, kCodeObjectOffset, v,
962 IteratePointers(obj, kStartOfStrongFieldsOffset, kEndOfStrongFieldsOffset,
963 v);
964 }
965
966 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> obj) {
967 return obj->SizeFromMap(map);
968 }
969};
970
972 public:
973 template <typename ObjectVisitor>
974 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
975 int object_size, ObjectVisitor* v) {
976 IteratePointers(obj, HeapObject::kHeaderSize, object_size, v);
977 }
978
979 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> obj) {
980 return obj->SizeFromMap(map);
981 }
982};
983
985 public:
986 static_assert(kTableOffset + kTaggedSize == kHeaderSizeOfAllWeakCollections);
987
988 template <typename ObjectVisitor>
989 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
990 int object_size, ObjectVisitor* v) {
991 IterateJSObjectBodyImpl(map, obj, kPropertiesOrHashOffset, object_size, v);
992 }
993
994 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
995 return map->instance_size();
996 }
997};
998
1000 : public BodyDescriptorBase {
1001 public:
1002 template <typename ObjectVisitor>
1003 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1004 int object_size, ObjectVisitor* v) {
1005 IteratePointers(obj, kPropertiesOrHashOffset, kEndOfTaggedFieldsOffset, v);
1006 v->VisitExternalPointer(obj,
1007 obj->RawExternalPointerField(kWaiterQueueHeadOffset,
1009 }
1010
1011 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
1012 return map->instance_size();
1013 }
1014};
1015
1016#if V8_ENABLE_WEBASSEMBLY
1017class WasmTypeInfo::BodyDescriptor final : public BodyDescriptorBase {
1018 public:
1019 template <typename ObjectVisitor>
1020 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1021 int object_size, ObjectVisitor* v) {
1022 IteratePointers(obj, kSupertypesOffset, SizeOf(map, obj), v);
1023 }
1024
1025 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
1026 return kSupertypesOffset +
1027 Cast<WasmTypeInfo>(object)->supertypes_length() * kTaggedSize;
1028 }
1029};
1030
1031class WasmMemoryMapDescriptor::BodyDescriptor : public BodyDescriptorBase {
1032 public:
1033 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1034 int object_size, ObjectVisitor* v) {
1035 IterateMaybeWeakPointer(obj, kMemoryOffset, v);
1036 }
1037
1038 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
1039 return map->instance_size();
1040 }
1041};
1042
1043class WasmInstanceObject::BodyDescriptor final : public BodyDescriptorBase {
1044 public:
1045 template <typename ObjectVisitor>
1046 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1047 int object_size, ObjectVisitor* v) {
1048 IteratePointers(obj, kPropertiesOrHashOffset, JSObject::kHeaderSize, v);
1049 IterateTrustedPointer(obj, kTrustedDataOffset, v,
1050 IndirectPointerMode::kStrong,
1051 kWasmTrustedInstanceDataIndirectPointerTag);
1052 IteratePointer(obj, kModuleObjectOffset, v);
1053 IteratePointer(obj, kExportsObjectOffset, v);
1054 IterateJSObjectBodyImpl(map, obj, kHeaderSize, object_size, v);
1055 }
1056
1057 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
1058 return map->instance_size();
1059 }
1060};
1061
1062class WasmTrustedInstanceData::BodyDescriptor final
1063 : public BodyDescriptorBase {
1064 public:
1065 template <typename ObjectVisitor>
1066 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1067 int object_size, ObjectVisitor* v) {
1068 IterateSelfIndirectPointer(obj, kWasmTrustedInstanceDataIndirectPointerTag,
1069 v);
1070 for (uint16_t offset : kTaggedFieldOffsets) {
1071 IteratePointer(obj, offset, v);
1072 }
1073
1074 for (uint16_t offset : kProtectedFieldOffsets) {
1075 IterateProtectedPointer(obj, offset, v);
1076 }
1077 }
1078
1079 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
1080 return kSize;
1081 }
1082};
1083
1084class WasmTableObject::BodyDescriptor final : public BodyDescriptorBase {
1085 public:
1086 template <typename ObjectVisitor>
1087 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1088 int object_size, ObjectVisitor* v) {
1089 IteratePointers(obj, JSObject::BodyDescriptor::kStartOffset,
1090 kTrustedDispatchTableOffset, v);
1091 IterateTrustedPointer(obj, kTrustedDispatchTableOffset, v,
1092 IndirectPointerMode::kStrong,
1093 kWasmDispatchTableIndirectPointerTag);
1094 IterateTrustedPointer(obj, kTrustedDataOffset, v,
1095 IndirectPointerMode::kStrong,
1096 kWasmTrustedInstanceDataIndirectPointerTag);
1097 IterateJSObjectBodyImpl(map, obj, kHeaderSize, object_size, v);
1098 }
1099
1100 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
1101 return map->instance_size();
1102 }
1103};
1104
1105class WasmTagObject::BodyDescriptor final : public BodyDescriptorBase {
1106 public:
1107 template <typename ObjectVisitor>
1108 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1109 int object_size, ObjectVisitor* v) {
1110 IteratePointers(obj, JSObject::BodyDescriptor::kStartOffset,
1111 kTrustedDataOffset, v);
1112 IterateTrustedPointer(obj, kTrustedDataOffset, v,
1113 IndirectPointerMode::kStrong,
1114 kWasmTrustedInstanceDataIndirectPointerTag);
1115 IterateJSObjectBodyImpl(map, obj, kHeaderSize, object_size, v);
1116 }
1117
1118 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
1119 return map->instance_size();
1120 }
1121};
1122
1123class WasmGlobalObject::BodyDescriptor final : public BodyDescriptorBase {
1124 public:
1125 template <typename ObjectVisitor>
1126 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1127 int object_size, ObjectVisitor* v) {
1128 IteratePointers(obj, JSObject::BodyDescriptor::kStartOffset,
1129 kTrustedDataOffset, v);
1130 IterateTrustedPointer(obj, kTrustedDataOffset, v,
1131 IndirectPointerMode::kStrong,
1132 kWasmTrustedInstanceDataIndirectPointerTag);
1133 IteratePointer(obj, kUntaggedBufferOffset, v);
1134 IteratePointer(obj, kTaggedBufferOffset, v);
1135 IterateJSObjectBodyImpl(map, obj, kIsMutableOffset + kTaggedSize,
1136 object_size, v);
1137 }
1138
1139 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
1140 return map->instance_size();
1141 }
1142};
1143
1144class WasmDispatchTable::BodyDescriptor final : public BodyDescriptorBase {
1145 public:
1146 template <typename ObjectVisitor>
1147 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1148 int object_size, ObjectVisitor* v) {
1149 IterateSelfIndirectPointer(obj, kWasmDispatchTableIndirectPointerTag, v);
1150 IterateProtectedPointer(obj, kProtectedOffheapDataOffset, v);
1151 IterateProtectedPointer(obj, kProtectedUsesOffset, v);
1152 int length = Cast<WasmDispatchTable>(obj)->length(kAcquireLoad);
1153 for (int i = 0; i < length; ++i) {
1154 IterateProtectedPointer(obj, OffsetOf(i) + kImplicitArgBias, v);
1155 }
1156 }
1157
1158 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
1159 int capacity = Cast<WasmDispatchTable>(object)->capacity();
1160 return SizeFor(capacity);
1161 }
1162};
1163
1164class WasmArray::BodyDescriptor final : public BodyDescriptorBase {
1165 public:
1166 template <typename ObjectVisitor>
1167 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1168 int object_size, ObjectVisitor* v) {
1169 if (!WasmArray::GcSafeElementType(map).is_reference()) return;
1170 IteratePointers(obj, WasmArray::kHeaderSize, object_size, v);
1171 }
1172
1173 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
1174 return WasmArray::SizeFor(map, UncheckedCast<WasmArray>(object)->length());
1175 }
1176};
1177
1178class WasmStruct::BodyDescriptor final : public BodyDescriptorBase {
1179 public:
1180 template <typename ObjectVisitor>
1181 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1182 int object_size, ObjectVisitor* v) {
1183 Tagged<WasmStruct> wasm_struct = UncheckedCast<WasmStruct>(obj);
1184 const wasm::CanonicalStructType* type = WasmStruct::GcSafeType(map);
1185 if (type->is_descriptor()) {
1186 // The associated Map is stored where the first field would otherwise be.
1187 DCHECK_NE(type->field_offset(0), 0);
1188 v->VisitPointer(wasm_struct, wasm_struct->RawField(0));
1189 }
1190 for (uint32_t i = 0; i < type->field_count(); i++) {
1191 if (!type->field(i).is_reference()) continue;
1192 int offset = static_cast<int>(type->field_offset(i));
1193 v->VisitPointer(wasm_struct, wasm_struct->RawField(offset));
1194 }
1195 }
1196
1197 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
1198 return WasmStruct::GcSafeSize(map);
1199 }
1200};
1201
1202class WasmNull::BodyDescriptor : public DataOnlyBodyDescriptor {
1203 public:
1204 static_assert(WasmNull::kStartOfStrongFieldsOffset ==
1205 WasmNull::kEndOfStrongFieldsOffset);
1206
1207 static constexpr int kSize = WasmNull::kSize;
1208
1209 static constexpr int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
1210 return kSize;
1211 }
1212};
1213
1214class WasmMemoryObject::BodyDescriptor final : public BodyDescriptorBase {
1215 public:
1216 template <typename ObjectVisitor>
1217 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1218 int object_size, ObjectVisitor* v) {
1219 IteratePointers(obj, JSObject::BodyDescriptor::kStartOffset,
1220 kEndOfStrongFieldsOffset, v);
1221 IterateJSObjectBodyImpl(map, obj, kHeaderSize, object_size, v);
1222 }
1223
1224 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
1225 return map->instance_size();
1226 }
1227};
1228#endif // V8_ENABLE_WEBASSEMBLY
1229
1231 public:
1232 template <typename ObjectVisitor>
1233 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1234 int object_size, ObjectVisitor* v) {
1236 v->VisitExternalPointer(obj, ExternalPointerSlot(&string->resource_));
1237 if (string->is_uncached()) return;
1238 v->VisitExternalPointer(obj, ExternalPointerSlot(&string->resource_data_));
1239 }
1240
1241 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
1242 InstanceType type = map->instance_type();
1243 const auto is_uncached =
1245 return is_uncached ? sizeof(UncachedExternalString)
1246 : sizeof(ExternalString);
1247 }
1248};
1249
1251 public:
1252 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
1254 return CoverageInfo::SizeFor(info->slot_count());
1255 }
1256};
1257
1259 public:
1260 static_assert(static_cast<int>(HeapObject::kHeaderSize) ==
1261 static_cast<int>(kCodeOffset));
1262 static_assert(kCodeOffset + kTaggedSize == kRelocationInfoOffset);
1263 static_assert(kRelocationInfoOffset + kTaggedSize == kDataStart);
1264
1265 static constexpr int kRelocModeMask =
1275
1276 template <typename ObjectVisitor>
1277 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1278 ObjectVisitor* v) {
1279 IterateProtectedPointer(obj, kCodeOffset, v);
1280 IterateProtectedPointer(obj, kRelocationInfoOffset, v);
1281
1283 if (istream->IsFullyInitialized()) {
1284 RelocIterator it(istream, kRelocModeMask);
1285 v->VisitRelocInfo(istream, &it);
1286 }
1287 }
1288
1289 template <typename ObjectVisitor>
1290 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1291 int object_size, ObjectVisitor* v) {
1292 IterateBody(map, obj, v);
1293 }
1294
1295 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
1296 return UncheckedCast<InstructionStream>(object)->Size();
1297 }
1298};
1299
1301 public:
1302 template <typename ObjectVisitor>
1303 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1304 int object_size, ObjectVisitor* v) {
1305 IteratePointers(obj, Map::kStartOfStrongFieldsOffset,
1306 Map::kEndOfStrongFieldsOffset, v);
1307 IterateMaybeWeakPointer(obj, kTransitionsOrPrototypeInfoOffset, v);
1308 }
1309
1310 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> obj) {
1311 return Map::kSize;
1312 }
1313};
1314
1316 public:
1317 template <typename ObjectVisitor>
1318 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1319 int object_size, ObjectVisitor* v) {
1320 static_assert(
1322 "Field order must be in sync with this iteration code");
1326 object_size, v);
1327 }
1328
1329 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
1330 return object->SizeFromMap(map);
1331 }
1332};
1333
1335 public:
1336 template <typename ObjectVisitor>
1337 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1338 int object_size, ObjectVisitor* v) {
1339 IteratePointers(obj, NativeContext::kStartOfStrongFieldsOffset,
1340 NativeContext::kEndOfStrongFieldsOffset, v);
1341 IterateCustomWeakPointers(obj, NativeContext::kStartOfWeakFieldsOffset,
1342 NativeContext::kEndOfWeakFieldsOffset, v);
1344 obj, obj->RawExternalPointerField(kMicrotaskQueueOffset,
1346 }
1347
1348 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
1349 return NativeContext::kSize;
1350 }
1351};
1352
1354 public:
1355 template <typename ObjectVisitor>
1356 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1357 int object_size, ObjectVisitor* v) {
1358 IterateSelfIndirectPointer(obj, kCodeIndirectPointerTag, v);
1360 obj, Code::kDeoptimizationDataOrInterpreterDataOffset, v);
1361 IterateProtectedPointer(obj, Code::kPositionTableOffset, v);
1362 IteratePointers(obj, Code::kStartOfStrongFieldsOffset,
1363 Code::kEndOfStrongFieldsWithMainCageBaseOffset, v);
1364
1365 static_assert(Code::kEndOfStrongFieldsWithMainCageBaseOffset ==
1366 Code::kInstructionStreamOffset);
1367
1368#ifdef V8_ENABLE_LEAPTIERING
1369 IterateJSDispatchEntry(obj, kDispatchHandleOffset, v);
1370#endif // V8_ENABLE_LEAPTIERING
1371
1373 Cast<Code>(obj),
1374 obj->RawInstructionStreamField(kInstructionStreamOffset));
1375 }
1376
1377 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
1378 return Code::kSize;
1379 }
1380};
1381
1383 public:
1384 template <typename ObjectVisitor>
1385 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1386 int object_size, ObjectVisitor* v) {
1388 }
1389
1390 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> obj) {
1391 return kSize;
1392 }
1393};
1394
1396 public:
1397 template <typename ObjectVisitor>
1398 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1399 int object_size, ObjectVisitor* v) {
1400#ifdef V8_COMPRESS_POINTERS
1401 static_assert(kEmbedderDataSlotSize == 2 * kTaggedSize);
1403 offset < object_size; offset += kEmbedderDataSlotSize) {
1406 obj, obj->RawExternalPointerField(
1409 }
1410
1411#else
1412 // We store raw aligned pointers as Smis, so it's safe to iterate the whole
1413 // array.
1414 static_assert(kEmbedderDataSlotSize == kTaggedSize);
1415 IteratePointers(obj, EmbedderDataArray::kHeaderSize, object_size, v);
1416#endif
1417 }
1418
1419 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
1420 return object->SizeFromMap(map);
1421 }
1422};
1423
1425 public:
1426 template <typename ObjectVisitor>
1427 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1428 int object_size, ObjectVisitor* v) {
1429 int entries_start = EphemeronHashTable::OffsetOfElementAt(
1430 EphemeronHashTable::kElementsStartIndex);
1431 IteratePointers(obj, OFFSET_OF_DATA_START(EphemeronHashTable),
1432 entries_start, v);
1434 for (InternalIndex i : table->IterateEntries()) {
1435 const int key_index = EphemeronHashTable::EntryToIndex(i);
1436 const int value_index = EphemeronHashTable::EntryToValueIndex(i);
1437 IterateEphemeron(obj, i.as_int(), OffsetOfElementAt(key_index),
1438 OffsetOfElementAt(value_index), v);
1439 }
1440 }
1441
1442 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
1443 return object->SizeFromMap(map);
1444 }
1445};
1446
1448 public:
1449 static_assert(AccessorInfo::kEndOfStrongFieldsOffset ==
1450 AccessorInfo::kMaybeRedirectedGetterOffset);
1451 static_assert(AccessorInfo::kMaybeRedirectedGetterOffset <
1452 AccessorInfo::kSetterOffset);
1453 static_assert(AccessorInfo::kSetterOffset < AccessorInfo::kFlagsOffset);
1454 static_assert(AccessorInfo::kFlagsOffset < AccessorInfo::kSize);
1455
1456 template <typename ObjectVisitor>
1457 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1458 int object_size, ObjectVisitor* v) {
1460 AccessorInfo::kEndOfStrongFieldsOffset, v);
1461 v->VisitExternalPointer(obj, obj->RawExternalPointerField(
1462 AccessorInfo::kMaybeRedirectedGetterOffset,
1465 obj, obj->RawExternalPointerField(AccessorInfo::kSetterOffset,
1467 }
1468
1469 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
1470 return kSize;
1471 }
1472};
1473
1475 public:
1476 static_assert(InterceptorInfo::kEndOfStrongFieldsOffset ==
1477 InterceptorInfo::kFlagsOffset);
1478 static_assert(InterceptorInfo::kFlagsOffset < InterceptorInfo::kGetterOffset);
1479 static_assert(InterceptorInfo::kGetterOffset <
1480 InterceptorInfo::kSetterOffset);
1481 static_assert(InterceptorInfo::kSetterOffset < InterceptorInfo::kQueryOffset);
1482 static_assert(InterceptorInfo::kQueryOffset <
1483 InterceptorInfo::kDescriptorOffset);
1484 static_assert(InterceptorInfo::kDescriptorOffset <
1485 InterceptorInfo::kDeleterOffset);
1486 static_assert(InterceptorInfo::kDeleterOffset <
1487 InterceptorInfo::kEnumeratorOffset);
1488 static_assert(InterceptorInfo::kEnumeratorOffset <
1489 InterceptorInfo::kDefinerOffset);
1490 static_assert(InterceptorInfo::kDefinerOffsetEnd + 1 ==
1491 InterceptorInfo::kSize);
1492
1493 template <typename ObjectVisitor>
1494 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1495 int object_size, ObjectVisitor* v) {
1497 InterceptorInfo::kEndOfStrongFieldsOffset, v);
1498
1499 const bool is_named = Cast<InterceptorInfo>(obj)->is_named();
1500
1501#define VISIT_FIELD(Name, name) \
1502 v->VisitExternalPointer( \
1503 obj, obj->RawExternalPointerField( \
1504 InterceptorInfo::k##Name##Offset, \
1505 is_named ? kApiNamedProperty##Name##CallbackTag \
1506 : kApiIndexedProperty##Name##CallbackTag));
1507
1509#undef VISIT_FIELD
1510 }
1511
1512 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
1513 return kSize;
1514 }
1515};
1516
1518 public:
1519 template <typename ObjectVisitor>
1520 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1521 int object_size, ObjectVisitor* v) {
1523 FunctionTemplateInfo::kEndOfStrongFieldsOffset, v);
1525 obj, obj->RawExternalPointerField(
1526 FunctionTemplateInfo::kMaybeRedirectedCallbackOffset,
1528 }
1529
1530 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
1531 return kSize;
1532 }
1533};
1534
1535// TODO(jgruber): Combine these into generic Suffix descriptors.
1537 : public SuffixRangeBodyDescriptor<HeapObject::kHeaderSize> {
1538 public:
1539 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> raw_object) {
1540 return UncheckedCast<FixedArray>(raw_object)->AllocatedSize();
1541 }
1542};
1543
1545 : public SuffixRangeBodyDescriptor<TrustedObject::kHeaderSize> {
1546 public:
1547 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> raw_object) {
1548 return UncheckedCast<TrustedFixedArray>(raw_object)->AllocatedSize();
1549 }
1550};
1551
1553 public:
1554 template <typename ObjectVisitor>
1555 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1556 int object_size, ObjectVisitor* v) {
1558 offset < object_size; offset += kTaggedSize) {
1560 }
1561 }
1562
1563 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> raw_object) {
1564 return UncheckedCast<ProtectedFixedArray>(raw_object)->AllocatedSize();
1565 }
1566};
1567
1569 : public SuffixRangeBodyDescriptor<HeapObject::kHeaderSize> {
1570 public:
1571 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> raw_object) {
1572 return UncheckedCast<SloppyArgumentsElements>(raw_object)->AllocatedSize();
1573 }
1574};
1575
1577 : public SuffixRangeBodyDescriptor<HeapObject::kHeaderSize> {
1578 public:
1579 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> raw_object) {
1580 return UncheckedCast<RegExpMatchInfo>(raw_object)->AllocatedSize();
1581 }
1582};
1583
1585 : public SuffixRangeBodyDescriptor<HeapObject::kHeaderSize> {
1586 public:
1587 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> raw_object) {
1588 return UncheckedCast<ArrayList>(raw_object)->AllocatedSize();
1589 }
1590};
1591
1593 : public SuffixRangeBodyDescriptor<HeapObject::kHeaderSize> {
1594 public:
1595 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> raw_object) {
1597 ->AllocatedSize();
1598 }
1599};
1600
1602 public:
1603 template <typename ObjectVisitor>
1604 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1605 int object_size, ObjectVisitor* v) {
1606 IteratePointer(obj, kValueOffset, v);
1607
1608#ifdef V8_ENABLE_LEAPTIERING
1609 IterateJSDispatchEntry(obj, kDispatchHandleOffset, v);
1610#endif
1611 }
1612
1613 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> object) {
1614 return kAlignedSize;
1615 }
1616};
1617
1619 : public SuffixRangeBodyDescriptor<HeapObject::kHeaderSize> {
1620 public:
1621 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> raw_object) {
1622 return UncheckedCast<ClosureFeedbackCellArray>(raw_object)->AllocatedSize();
1623 }
1624};
1625
1627 : public SuffixRangeBodyDescriptor<HeapObject::kHeaderSize> {
1628 public:
1629 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> raw_object) {
1630 return UncheckedCast<ScriptContextTable>(raw_object)->AllocatedSize();
1631 }
1632};
1633
1635 : public SuffixRangeWeakBodyDescriptor<HeapObject::kHeaderSize> {
1636 public:
1637 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> raw_object) {
1638 return UncheckedCast<WeakFixedArray>(raw_object)->AllocatedSize();
1639 }
1640};
1641
1643 : public SuffixRangeWeakBodyDescriptor<HeapObject::kHeaderSize> {
1644 public:
1645 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> raw_object) {
1646 return UncheckedCast<TrustedWeakFixedArray>(raw_object)->AllocatedSize();
1647 }
1648};
1649
1651 : public BodyDescriptorBase {
1652 public:
1653 template <typename ObjectVisitor>
1654 static inline void IterateBody(Tagged<Map> map, Tagged<HeapObject> obj,
1655 int object_size, ObjectVisitor* v) {
1658 offset < object_size; offset += kTaggedSize) {
1659 v->VisitProtectedPointer(host,
1660 host->RawProtectedMaybeObjectField(offset));
1661 }
1662 }
1663
1664 static inline int SizeOf(Tagged<Map> map, Tagged<HeapObject> raw_object) {
1665 return UncheckedCast<ProtectedWeakFixedArray>(raw_object)->AllocatedSize();
1666 }
1667};
1668
1669#include "torque-generated/objects-body-descriptors-inl.inc"
1670
1671} // namespace internal
1672} // namespace v8
1673
1674#endif // V8_OBJECTS_OBJECTS_BODY_DESCRIPTORS_INL_H_
#define INTERCEPTOR_INFO_CALLBACK_LIST(V)
UnderlyingType underlying_type
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
TaggedMember< DependentCode > dependent_code_
std::atomic< int32_t > pretenure_data_
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > raw_object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > obj)
uint32_t length() const
Definition bigint.h:90
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > obj)
static uint32_t SizeFor(uint32_t length)
Definition bigint.h:252
static void IteratePointer(Tagged< HeapObject > obj, int offset, ObjectVisitor *v)
static void IterateCustomWeakPointer(Tagged< HeapObject > obj, int offset, ObjectVisitor *v)
static void IterateSelfIndirectPointer(Tagged< HeapObject > obj, IndirectPointerTag tag, ObjectVisitor *v)
static void IterateMaybeWeakPointers(Tagged< HeapObject > obj, int start_offset, int end_offset, ObjectVisitor *v)
static void IterateJSObjectBodyImpl(Tagged< Map > map, Tagged< HeapObject > obj, int start_offset, int end_offset, ObjectVisitor *v)
static void IterateCodePointer(Tagged< HeapObject > obj, int offset, ObjectVisitor *visitor, IndirectPointerMode mode)
static void IterateTrustedPointer(Tagged< HeapObject > obj, int offset, ObjectVisitor *visitor, IndirectPointerMode mode, IndirectPointerTag tag)
static void IterateProtectedPointer(Tagged< HeapObject > obj, int offset, ObjectVisitor *v)
static void IterateJSObjectBodyWithoutEmbedderFieldsImpl(Tagged< Map > map, Tagged< HeapObject > obj, int start_offset, int end_offset, ObjectVisitor *v)
static void IteratePointers(Tagged< HeapObject > obj, int start_offset, int end_offset, ObjectVisitor *v)
static void IterateMaybeWeakPointer(Tagged< HeapObject > obj, int offset, ObjectVisitor *v)
static void IterateCustomWeakPointers(Tagged< HeapObject > obj, int start_offset, int end_offset, ObjectVisitor *v)
static void IterateEphemeron(Tagged< HeapObject > obj, int index, int key_offset, int value_offset, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > obj)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > obj)
static constexpr int SizeFor(int length)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > obj)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > obj)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > raw_object)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > obj)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static int SizeFor(int slot_count)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
TaggedMember< UnionOf< Smi, Code > > smi_handler_
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > obj)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static constexpr int OffsetOfElementAt(int index)
static constexpr int kTaggedPayloadOffset
static constexpr int kExternalPointerOffset
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static const int kAlignedSize
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > obj)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > raw_object)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > obj)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > raw_object)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > raw_object)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static constexpr int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static constexpr int kHeaderSize
static constexpr int kMapOffset
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, ObjectVisitor *v)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static const int kJSAPIObjectWithEmbedderSlotsHeaderSize
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > raw_object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > obj)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static void IterateJSAPIObjectWithEmbedderSlotsHeader(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static void IterateJSAPIObjectWithoutEmbedderSlotsTail(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static void IterateJSAPIObjectWithEmbedderSlotsTail(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static constexpr bool kContainsEmbedderFields
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static constexpr int kEndOfTaggedFieldsOffset
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int GetHeaderSize(bool function_has_prototype_slot)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
bool MayHaveEmbedderFields() const
static V8_EXPORT_PRIVATE int GetHeaderSize(InstanceType instance_type, bool function_has_prototype_slot=false)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static constexpr bool kContainsEmbedderFields
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static const int kHeaderSizeOfAllWeakCollections
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > obj)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > raw_object)
virtual void VisitProtectedPointer(Tagged< TrustedObject > host, ProtectedPointerSlot slot)
Definition visitors.h:200
virtual void VisitTrustedPointerTableEntry(Tagged< HeapObject > host, IndirectPointerSlot slot)
Definition visitors.h:205
virtual void VisitIndirectPointer(Tagged< HeapObject > host, IndirectPointerSlot slot, IndirectPointerMode mode)
Definition visitors.h:196
virtual void VisitExternalPointer(Tagged< HeapObject > host, ExternalPointerSlot slot)
Definition visitors.h:188
virtual void VisitMapPointer(Tagged< HeapObject > host)
Definition visitors.h:211
virtual void VisitCppHeapPointer(Tagged< HeapObject > host, CppHeapPointerSlot slot)
Definition visitors.h:193
virtual void VisitCustomWeakPointers(Tagged< HeapObject > host, ObjectSlot start, ObjectSlot end)
Definition visitors.h:151
virtual void VisitPointers(Tagged< HeapObject > host, ObjectSlot start, ObjectSlot end)=0
virtual void VisitJSDispatchTableEntry(Tagged< HeapObject > host, JSDispatchHandle handle)
Definition visitors.h:208
virtual void VisitEphemeron(Tagged< HeapObject > host, int index, ObjectSlot key, ObjectSlot value)
Definition visitors.h:167
virtual void VisitCustomWeakPointer(Tagged< HeapObject > host, ObjectSlot p)
Definition visitors.h:163
virtual void VisitPointer(Tagged< HeapObject > host, ObjectSlot p)
Definition visitors.h:157
virtual void VisitInstructionStreamPointer(Tagged< Code > host, InstructionStreamSlot slot)=0
void VisitRelocInfo(Tagged< InstructionStream > host, RelocIterator *it)
Definition visitors.cc:30
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > obj)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeFor(int data_length, int children_length)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > raw_object)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > raw_object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > obj)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > obj)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > obj)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > raw_object)
static constexpr int ModeMask(Mode mode)
Definition reloc-info.h:272
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > raw_object)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > raw_object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > raw_object)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > raw_object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > obj)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > obj)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > obj)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > raw_object)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > raw_object)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > raw_object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > raw_object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > raw_object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > raw_object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > object)
static void IterateBody(Tagged< Map > map, Tagged< HeapObject > obj, int object_size, ObjectVisitor *v)
static int SizeOf(Tagged< Map > map, Tagged< HeapObject > raw_object)
int32_t offset
std::map< const std::string, const std::string > map
std::optional< std::tuple< size_t, std::string > > SizeOf(const Type *type)
Definition types.cc:1337
constexpr bool is_reference(ValueKind kind)
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
Definition handles-inl.h:72
constexpr int kTaggedSize
Definition globals.h:542
const uint32_t kUncachedExternalStringTag
constexpr int kEmbedderDataSlotSize
Definition globals.h:664
const uint32_t kUncachedExternalStringMask
Handle< To > UncheckedCast(Handle< From > value)
Definition handles-inl.h:55
constexpr int kInt32Size
Definition globals.h:401
@ kExternalObjectValueTag
@ kEmbedderDataSlotPayloadTag
@ kNativeContextMicrotaskQueueTag
@ kArrayBufferExtensionTag
@ kFunctionTemplateInfoCallbackTag
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
Definition casting.h:150
static constexpr AcquireLoadTag kAcquireLoad
Definition globals.h:2908
#define VISIT_FIELD(Name, name)
#define DCHECK_LE(v1, v2)
Definition logging.h:490
#define DCHECK_IMPLIES(v1, v2)
Definition logging.h:493
#define DCHECK_NE(v1, v2)
Definition logging.h:486
#define DCHECK_GE(v1, v2)
Definition logging.h:488
#define DCHECK(condition)
Definition logging.h:482
#define DCHECK_EQ(v1, v2)
Definition logging.h:485
#define V8_EXPORT_PRIVATE
Definition macros.h:460
#define DISABLE_CFI_PERF
Definition macros.h:197
#define OFFSET_OF_DATA_START(Type)