5#ifndef INCLUDE_CPPGC_VISITOR_H_
6#define INCLUDE_CPPGC_VISITOR_H_
23template <
typename T,
typename WeaknessPolicy,
typename LocationPolicy,
24 typename CheckingPolicy>
25class BasicCrossThreadPersistent;
26template <
typename T,
typename WeaknessPolicy,
typename LocationPolicy,
27 typename CheckingPolicy>
29class ConservativeTracingVisitor;
58 friend class internal::VisitorFactory;
72 const T* value = member.GetRawAtomic();
84 static_assert(
sizeof(T),
"Pointee type must be fully defined.");
86 "T must be GarbageCollected or GarbageCollectedMixin type");
88 "Weak references to compactable objects are not allowed");
90 const T* value = weak_member.GetRawAtomic();
102#if defined(CPPGC_POINTER_COMPRESSION)
108 template <
typename T>
110 const T* value = member.GetRawAtomic();
122 template <
typename T>
129 CheckObjectNotInConstruction(&
object);
140 template <
typename T,
void (T::*method)(const LivenessBroker&)>
142 RegisterWeakCallback(&WeakCallbackMethodDelegate<T, method>,
object);
151 template <
typename K,
typename V>
153 TraceEphemeron(ephemeron_pair.
key, &ephemeron_pair.
value);
154 RegisterWeakCallbackMethod<EphemeronPair<K, V>,
166 template <
typename KeyType,
typename ValueType>
169 const KeyType* key = weak_member_key.GetRawAtomic();
174 const ValueType* value = member_value->GetRawAtomic();
181 const void* key_base_object_payload =
185 VisitEphemeron(key_base_object_payload, value, value_desc);
199 template <
typename KeyType,
typename ValueType>
201 const ValueType* value) {
202 static_assert(!IsGarbageCollectedOrMixinTypeV<ValueType>,
203 "garbage-collected types must use WeakMember and Member");
204 const KeyType* key = weak_member_key.GetRawAtomic();
216 const void* key_base_object_payload =
220 VisitEphemeron(key_base_object_payload, value, value_desc);
228 template <
typename T>
230 const T* value = weak_member.GetRawAtomic();
240 template <
typename T>
253 template <
typename T>
255 const void* callback_data) {
269 template <
typename T>
272 "Only references to objects allocated on compactable spaces "
273 "should be registered as movable slots.");
274 static_assert(!IsGarbageCollectedMixinTypeV<T>,
275 "Mixin types do not support compaction.");
276 HandleMovableReference(
reinterpret_cast<const void**
>(slot));
301 const void* parameter,
TraceCallback callback,
size_t deferred_size) {
309 const void* weak_member) {}
318 template <
typename T,
void (T::*method)(const LivenessBroker&)>
319 static void WeakCallbackMethodDelegate(
const LivenessBroker& info,
323 (
const_cast<T*
>(
static_cast<const T*
>(self))->*method)(info);
326 template <
typename Po
interType>
327 static void HandleWeak(
const LivenessBroker& info,
const void*
object) {
328 const PointerType* weak =
static_cast<const PointerType*
>(object);
329 auto* raw_ptr = weak->GetFromGC();
330 if (!info.IsHeapObjectAlive(raw_ptr)) {
335 template <
typename T>
336 void TraceImpl(
const T* t) {
337 static_assert(
sizeof(T),
"Pointee type must be fully defined.");
338 static_assert(internal::IsGarbageCollectedOrMixinType<T>::value,
339 "T must be GarbageCollected or GarbageCollectedMixin type");
343 Visit(t, TraceTrait<T>::GetTraceDescriptor(t));
347 void CheckObjectNotInConstruction(
const void* address);
350 template <
typename T,
typename WeaknessPolicy,
typename LocationPolicy,
351 typename CheckingPolicy>
353 template <
typename T,
typename WeaknessPolicy,
typename LocationPolicy,
354 typename CheckingPolicy>
356 friend class internal::ConservativeTracingVisitor;
357 friend class internal::VisitorBase;
368 template <
typename AnyStrongPersistentType,
370 AnyStrongPersistentType::IsStrongPersistent::value>* =
nullptr>
371 void Trace(
const AnyStrongPersistentType& p) {
372 using PointeeType =
typename AnyStrongPersistentType::PointeeType;
373 const void*
object = Extract(p);
381 template <
typename AnyWeakPersistentType,
383 !AnyWeakPersistentType::IsStrongPersistent::value>* =
nullptr>
384 void Trace(
const AnyWeakPersistentType& p) {
385 using PointeeType =
typename AnyWeakPersistentType::PointeeType;
387 "Weak references to compactable objects are not allowed");
388 const void*
object = Extract(p);
393 &HandleWeak<AnyWeakPersistentType>, &p, p.Location());
402 template <
typename AnyPersistentType>
403 static const void* Extract(AnyPersistentType& p) {
404 using PointeeType =
typename AnyPersistentType::PointeeType;
405 static_assert(
sizeof(PointeeType),
406 "Persistent's pointee type must be fully defined");
408 "Persistent's pointee type must be GarbageCollected or "
409 "GarbageCollectedMixin");
410 return p.GetFromGC();
413 template <
typename Po
interType>
414 static void HandleWeak(
const LivenessBroker& info,
const void*
object) {
415 const PointerType* weak =
static_cast<const PointerType*
>(object);
416 auto* raw_ptr = weak->GetFromGC();
bool IsHeapObjectAlive(const T *object) const
virtual V8_WARN_UNUSED_RESULT bool DeferTraceToMutatorThreadIfConcurrent(const void *parameter, TraceCallback callback, size_t deferred_size)
void Trace(const WeakMember< T > &weak_member)
void Trace(const EphemeronPair< K, V > &ephemeron_pair)
void TraceStrongContainer(const T *object)
void RegisterMovableReference(const T **slot)
void Trace(const Member< T > &member)
virtual void VisitEphemeron(const void *key, const void *value, TraceDescriptor value_desc)
virtual ~Visitor()=default
void TraceEphemeron(const WeakMember< KeyType > &weak_member_key, const ValueType *value)
void Trace(const T &object)
void RegisterWeakCallbackMethod(const T *object)
virtual void VisitWeak(const void *self, TraceDescriptor, WeakCallback, const void *weak_member)
void TraceWeakContainer(const T *object, WeakCallback callback, const void *callback_data)
virtual void VisitWeakContainer(const void *self, TraceDescriptor strong_desc, TraceDescriptor weak_desc, WeakCallback callback, const void *data)
virtual void HandleMovableReference(const void **)
void TraceEphemeron(const WeakMember< KeyType > &weak_member_key, const Member< ValueType > *member_value)
void TraceStrongly(const WeakMember< T > &weak_member)
virtual void RegisterWeakCallback(WeakCallback callback, const void *data)
virtual void Visit(const void *self, TraceDescriptor)
virtual ~RootVisitor()=default
RootVisitor(Visitor::Key)
void Trace(const AnyStrongPersistentType &p)
void Trace(const AnyWeakPersistentType &p)
virtual void VisitRoot(const void *, TraceDescriptor, const SourceLocation &)
virtual void VisitWeakRoot(const void *self, TraceDescriptor, WeakCallback, const void *weak_root, const SourceLocation &)
#define CPPGC_DCHECK(condition)
void(*)(Visitor *visitor, const void *object) TraceCallback
void(*)(const LivenessBroker &, const void *) WeakCallback
constexpr internal::SentinelPointer kSentinelPointer
const void * base_object_payload
#define V8_WARN_UNUSED_RESULT