5#ifndef V8_HEAP_HEAP_VISITOR_H_
6#define V8_HEAP_HEAP_VISITOR_H_
47#define TYPED_VISITOR_ID_LIST(V) \
56 V(ContextSidePropertyCell) \
60 V(EmbedderDataArray) \
61 V(EphemeronHashTable) \
66 V(FunctionTemplateInfo) \
77 V(RegExpBoilerplateDescription) \
78 V(RegExpDataWrapper) \
81 V(SharedFunctionInfo) \
83 V(SloppyArgumentsElements) \
84 V(SmallOrderedHashMap) \
85 V(SmallOrderedHashSet) \
86 V(SmallOrderedNameDictionary) \
88 V(SwissNameDictionary) \
94 IF_WASM(V, WasmArray) \
95 IF_WASM(V, WasmFuncRef) \
96 IF_WASM(V, WasmMemoryMapDescriptor) \
97 IF_WASM(V, WasmNull) \
98 IF_WASM(V, WasmResumeData) \
99 IF_WASM(V, WasmStruct) \
100 IF_WASM(V, WasmSuspenderObject) \
101 IF_WASM(V, WasmTypeInfo) \
102 SIMPLE_HEAP_OBJECT_LIST1(V)
107#define TYPED_VISITOR_WITH_SLACK_ID_LIST(V) \
109 V(JSDataViewOrRabGsabDataView) \
111 V(JSExternalObject) \
112 V(JSFinalizationRegistry) \
116 V(JSSynchronizationPrimitive) \
118 V(JSWeakCollection) \
120 IF_WASM(V, WasmGlobalObject) \
121 IF_WASM(V, WasmInstanceObject) \
122 IF_WASM(V, WasmMemoryObject) \
123 IF_WASM(V, WasmSuspendingObject) \
124 IF_WASM(V, WasmTableObject) \
125 IF_WASM(V, WasmTagObject)
132#define VISITOR_IDS_WITH_READ_ONLY_MAPS_LIST(V) \
134 CONCRETE_TRUSTED_OBJECT_TYPE_LIST1(V) \
144 V(EmbedderDataArray) \
147 V(FeedbackMetadata) \
151 V(FixedDoubleArray) \
152 V(FunctionTemplateInfo) \
160 V(RegExpBoilerplateDescription) \
161 V(RegExpDataWrapper) \
163 V(SeqOneByteString) \
164 V(SeqTwoByteString) \
165 V(SharedFunctionInfo) \
166 V(ShortcutCandidate) \
168 V(SloppyArgumentsElements) \
175#define FORWARD_DECLARE(TypeName) class TypeName;
180#undef FORWARD_DECLARE
193template <
typename ConcreteVisitor>
201 requires(!ConcreteVisitor::UsePrecomputedObjectSize());
204 requires(!ConcreteVisitor::UsePrecomputedObjectSize());
208 requires(ConcreteVisitor::UsePrecomputedObjectSize());
239 template <VisitorId visitor_
id>
247 return static_cast<ConcreteVisitor*
>(
this);
251 return static_cast<const ConcreteVisitor*
>(
this);
254#define VISIT(TypeName) \
255 V8_INLINE size_t Visit##TypeName(Tagged<Map> map, Tagged<TypeName> object, \
256 MaybeObjectSize maybe_object_size);
264 MaybeObjectSize maybe_object_size);
266 MaybeObjectSize maybe_object_size);
268 MaybeObjectSize maybe_object_size);
270 MaybeObjectSize maybe_object_size);
272 MaybeObjectSize maybe_object_size);
274 MaybeObjectSize maybe_object_size);
276 template <
typename T,
typename TBodyDescriptor =
typename T::BodyDescriptor>
281 typename TBodyDescriptor =
typename T::BodyDescriptor>
285 template <
typename T>
290 template <
typename TSlot>
304#define SAFE_STRING_TRANSITION_SOURCES(V) \
305 V(SeqOneByteString, SeqOneByteString) \
306 V(SeqTwoByteString, SeqTwoByteString)
310#define UNSAFE_STRING_TRANSITION_SOURCES(V) \
311 V(ExternalString, ExternalString) \
312 V(ConsString, ConsString) \
313 V(SlicedString, SlicedString)
316#define UNSAFE_STRING_TRANSITION_TARGETS(V) \
317 UNSAFE_STRING_TRANSITION_SOURCES(V) \
318 V(ShortcutCandidate, ConsString) \
319 V(ThinString, ThinString)
324template <
typename ConcreteVisitor>
332#define VISIT_AS_LOCKED_STRING(VisitorId, TypeName) \
333 V8_INLINE size_t Visit##TypeName(Tagged<Map> map, Tagged<TypeName> object, \
334 MaybeObjectSize maybe_object_size);
337#undef VISIT_AS_LOCKED_STRING
339 template <
typename T>
343 template <
typename T>
349template <
typename ConcreteVisitor>
392class WeakObjectRetainer;
401 WeakObjectRetainer* retainer);
#define FORWARD_DECLARE(Name, Argc)
V8_INLINE ConcurrentHeapVisitor(Isolate *isolate)
static V8_INLINE Tagged< T > Cast(Tagged< HeapObject > object, const Heap *heap)
V8_INLINE size_t VisitStringLocked(Tagged< T > object)
static V8_INLINE constexpr bool EnableConcurrentVisitation()
V8_INLINE size_t VisitFiller(Tagged< Map > map, Tagged< HeapObject > object, MaybeObjectSize maybe_object_size)
const ConcreteVisitor * concrete_visitor() const
static V8_INLINE Tagged< T > Cast(Tagged< HeapObject > object, const Heap *heap)
static V8_INLINE constexpr bool ShouldVisitReadOnlyMapPointer()
static V8_INLINE constexpr bool ShouldUseUncheckedCast()
V8_INLINE size_t VisitShortcutCandidate(Tagged< Map > map, Tagged< ConsString > object, MaybeObjectSize maybe_object_size)
V8_INLINE size_t VisitJSObjectSubclass(Tagged< Map > map, Tagged< T > object, MaybeObjectSize maybe_object_size)
V8_INLINE void VisitMapPointerIfNeeded(Tagged< HeapObject > host)
static V8_INLINE constexpr bool ShouldVisitFullJSObject()
HeapVisitor(LocalIsolate *isolate)
static V8_INLINE constexpr bool CanEncounterFillerOrFreeSpace()
static V8_INLINE constexpr bool UsePrecomputedObjectSize()
ConcreteVisitor * concrete_visitor()
V8_INLINE size_t VisitFreeSpace(Tagged< Map > map, Tagged< FreeSpace > object, MaybeObjectSize maybe_object_size)
static V8_INLINE constexpr bool EnableConcurrentVisitation()
V8_INLINE size_t VisitStruct(Tagged< Map > map, Tagged< HeapObject > object, MaybeObjectSize maybe_object_size)
V8_INLINE size_t VisitJSObjectFast(Tagged< Map > map, Tagged< JSObject > object, MaybeObjectSize maybe_object_size)
std::optional< Tagged< Object > > GetObjectFilterReadOnlyAndSmiFast(TSlot slot) const
static V8_INLINE constexpr bool ShouldVisitMapPointer()
V8_INLINE size_t Visit(Tagged< HeapObject > object)
V8_INLINE size_t VisitJSApiObject(Tagged< Map > map, Tagged< JSObject > object, MaybeObjectSize maybe_object_size)
V8_INLINE size_t VisitWithBodyDescriptor(Tagged< Map > map, Tagged< T > object, MaybeObjectSize maybe_object_size)
MaybeObjectSize(size_t size)
size_t AssumeSize() const
void VisitInstructionStreamPointer(Tagged< Code >, InstructionStreamSlot) final
size_t VisitBytecodeArray(Tagged< Map >, Tagged< BytecodeArray >, MaybeObjectSize)
void VisitEmbeddedPointer(Tagged< InstructionStream > host, RelocInfo *) final
static V8_INLINE constexpr bool ShouldVisitMapPointer()
size_t VisitWeakCell(Tagged< Map >, Tagged< WeakCell >, MaybeObjectSize)
void VisitMapPointer(Tagged< HeapObject >) override
void VisitCodeTarget(Tagged< InstructionStream > host, RelocInfo *) final
size_t VisitNativeContext(Tagged< Map >, Tagged< NativeContext >, MaybeObjectSize)
size_t VisitSharedFunctionInfo(Tagged< Map > map, Tagged< SharedFunctionInfo >, MaybeObjectSize)
V8_INLINE NewSpaceVisitor(Isolate *isolate)
#define VISIT_AS_LOCKED_STRING(VisitorId, TypeName)
#define TYPED_VISITOR_WITH_SLACK_ID_LIST(V)
#define TYPED_VISITOR_ID_LIST(V)
#define UNSAFE_STRING_TRANSITION_SOURCES(V)
#define TORQUE_VISITOR_ID_LIST(V)
#define TRUSTED_VISITOR_ID_LIST(V)
Tagged< Object > VisitWeakList(Heap *heap, Tagged< Object > list, WeakObjectRetainer *retainer)
Tagged(T object) -> Tagged< T >
kInterpreterTrampolineOffset Tagged< HeapObject >
#define DCHECK_GT(v1, v2)