5#ifndef INCLUDE_CPPGC_VISITOR_H_
6#define INCLUDE_CPPGC_VISITOR_H_
26template <
typename T,
typename WeaknessPolicy,
typename LocationPolicy,
27 typename CheckingPolicy>
28class BasicCrossThreadPersistent;
29template <
typename T,
typename WeaknessPolicy,
typename LocationPolicy,
30 typename CheckingPolicy>
32class ConservativeTracingVisitor;
43template <
typename K,
typename V>
80 friend class internal::VisitorFactory;
94 const T* value = member.GetAtomic();
104 template <
typename T>
106 static_assert(
sizeof(T),
"Pointee type must be fully defined.");
108 "T must be GarbageCollected or GarbageCollectedMixin type");
110 "Weak references to compactable objects are not allowed");
112 const T* value = weak_member.GetAtomic();
124#if defined(CPPGC_POINTER_COMPRESSION)
130 template <
typename T>
132 const T* value = member.GetAtomic();
138 template <
typename T>
140 static_assert(
sizeof(T),
"Pointee type must be fully defined.");
142 "T must be GarbageCollected or GarbageCollectedMixin type");
143 VisitMultipleUncompressedMember(start, len,
147 template <
typename T,
148 std::enable_if_t<!std::is_same_v<
151 static_assert(
sizeof(T),
"Pointee type must be fully defined.");
153 "T must be GarbageCollected or GarbageCollectedMixin type");
154#if defined(CPPGC_POINTER_COMPRESSION)
155 static_assert(std::is_same_v<Member<T>, subtle::CompressedMember<T>>,
156 "Member and CompressedMember must be the same.");
157 VisitMultipleCompressedMember(start, len,
168 template <
typename T>
170 static_assert(!IsGarbageCollectedOrMixinTypeV<T>);
176 CheckObjectNotInConstruction(&
object);
181 template <
typename T>
188 CheckObjectNotInConstruction(start);
190 for (
size_t i = 0; i < len; ++i) {
191 const T*
object = &start[i];
192 if constexpr (std::is_polymorphic_v<T>) {
195 if (*
reinterpret_cast<const uintptr_t*
>(
object) == 0)
continue;
207 template <
typename T,
void (T::*method)(const LivenessBroker&)>
209 RegisterWeakCallback(&WeakCallbackMethodDelegate<T, method>,
object);
218 template <
typename K,
typename V>
220 TraceEphemeron(ephemeron_pair.
key, &ephemeron_pair.
value);
221 RegisterWeakCallbackMethod<EphemeronPair<K, V>,
233 template <
typename KeyType,
typename ValueType>
236 const KeyType* key = weak_member_key.GetAtomic();
241 const ValueType* value = member_value->GetAtomic();
248 const void* key_base_object_payload =
252 VisitEphemeron(key_base_object_payload, value, value_desc);
266 template <
typename KeyType,
typename ValueType>
268 const ValueType* value) {
269 static_assert(!IsGarbageCollectedOrMixinTypeV<ValueType>,
270 "garbage-collected types must use WeakMember and Member");
271 const KeyType* key = weak_member_key.GetAtomic();
283 const void* key_base_object_payload =
287 VisitEphemeron(key_base_object_payload, value, value_desc);
295 template <
typename T>
297 const T* value = weak_member.GetAtomic();
307 template <
typename T>
320 template <
typename T>
322 const void* callback_data) {
336 template <
typename T>
339 "Only references to objects allocated on compactable spaces "
340 "should be registered as movable slots.");
341 static_assert(!IsGarbageCollectedMixinTypeV<T>,
342 "Mixin types do not support compaction.");
343 HandleMovableReference(
reinterpret_cast<const void**
>(slot));
368 const void* parameter,
TraceCallback callback,
size_t deferred_size) {
381 const void* weak_member) {}
390 const void* start,
size_t len,
393 const char* it =
static_cast<const char*
>(start);
394 const char* end = it + len * internal::kSizeOfUncompressedMember;
395 for (; it < end; it += internal::kSizeOfUncompressedMember) {
398 if (!
object)
continue;
400 Visit(
object, get_trace_descriptor(
object));
404#if defined(CPPGC_POINTER_COMPRESSION)
405 virtual void VisitMultipleCompressedMember(
406 const void* start,
size_t len,
409 const char* it =
static_cast<const char*
>(start);
410 const char* end = it + len * internal::kSizeofCompressedMember;
411 for (; it < end; it += internal::kSizeofCompressedMember) {
412 const auto* current =
413 reinterpret_cast<const internal::CompressedPointer*
>(it);
414 const void*
object = current->LoadAtomic();
415 if (!
object)
continue;
417 Visit(
object, get_trace_descriptor(
object));
423 template <
typename T,
void (T::*method)(const LivenessBroker&)>
424 static void WeakCallbackMethodDelegate(
const LivenessBroker& info,
428 (
const_cast<T*
>(
static_cast<const T*
>(self))->*method)(info);
431 template <
typename Po
interType>
432 static void HandleWeak(
const LivenessBroker& info,
const void*
object) {
433 const PointerType* weak =
static_cast<const PointerType*
>(object);
434 if (!info.IsHeapObjectAlive(weak->GetFromGC())) {
439 template <
typename T>
440 void TraceImpl(
const T* t) {
441 static_assert(
sizeof(T),
"Pointee type must be fully defined.");
442 static_assert(internal::IsGarbageCollectedOrMixinType<T>::value,
443 "T must be GarbageCollected or GarbageCollectedMixin type");
447 Visit(t, TraceTrait<T>::GetTraceDescriptor(t));
451 void CheckObjectNotInConstruction(
const void* address);
454 template <
typename T,
typename WeaknessPolicy,
typename LocationPolicy,
455 typename CheckingPolicy>
457 template <
typename T,
typename WeaknessPolicy,
typename LocationPolicy,
458 typename CheckingPolicy>
460 friend class internal::ConservativeTracingVisitor;
461 friend class internal::VisitorBase;
464template <
typename K,
typename V>
477 template <
typename AnyStrongPersistentType,
479 AnyStrongPersistentType::IsStrongPersistent::value>* =
nullptr>
480 void Trace(
const AnyStrongPersistentType& p) {
481 using PointeeType =
typename AnyStrongPersistentType::PointeeType;
482 const void*
object = Extract(p);
490 template <
typename AnyWeakPersistentType,
492 !AnyWeakPersistentType::IsStrongPersistent::value>* =
nullptr>
493 void Trace(
const AnyWeakPersistentType& p) {
494 using PointeeType =
typename AnyWeakPersistentType::PointeeType;
496 "Weak references to compactable objects are not allowed");
497 const void*
object = Extract(p);
502 &HandleWeak<AnyWeakPersistentType>, &p, p.Location());
511 template <
typename AnyPersistentType>
512 static const void* Extract(AnyPersistentType& p) {
513 using PointeeType =
typename AnyPersistentType::PointeeType;
514 static_assert(
sizeof(PointeeType),
515 "Persistent's pointee type must be fully defined");
517 "Persistent's pointee type must be GarbageCollected or "
518 "GarbageCollectedMixin");
519 return p.GetFromGC();
522 template <
typename Po
interType>
523 static void HandleWeak(
const LivenessBroker& info,
const void*
object) {
524 const PointerType* weak =
static_cast<const PointerType*
>(object);
Definition: liveness-broker.h:44
bool IsHeapObjectAlive(const T *object) const
Definition: liveness-broker.h:47
void Trace(const Member< T > &member)
Definition: visitor.h:93
void TraceWeakContainer(const T *object, WeakCallback callback, const void *callback_data)
Definition: visitor.h:321
void TraceEphemeron(const WeakMember< KeyType > &weak_member_key, const Member< ValueType > *member_value)
Definition: visitor.h:234
void TraceEphemeron(const WeakMember< KeyType > &weak_member_key, const ValueType *value)
Definition: visitor.h:267
void TraceMultiple(const Member< T > *start, size_t len)
Definition: visitor.h:150
virtual void Visit(const void *self, TraceDescriptor)
Definition: visitor.h:379
virtual void VisitEphemeron(const void *key, const void *value, TraceDescriptor value_desc)
Definition: visitor.h:382
void Trace(const T &object)
Definition: visitor.h:169
void TraceStrongly(const WeakMember< T > &weak_member)
Definition: visitor.h:296
virtual void RegisterWeakCallback(WeakCallback callback, const void *data)
Definition: visitor.h:352
virtual void VisitWeak(const void *self, TraceDescriptor, WeakCallback, const void *weak_member)
Definition: visitor.h:380
void RegisterMovableReference(const T **slot)
Definition: visitor.h:337
virtual bool DeferTraceToMutatorThreadIfConcurrent(const void *parameter, TraceCallback callback, size_t deferred_size)
Definition: visitor.h:367
virtual void HandleMovableReference(const void **)
Definition: visitor.h:387
virtual void VisitMultipleUncompressedMember(const void *start, size_t len, TraceDescriptorCallback get_trace_descriptor)
Definition: visitor.h:389
virtual void VisitWeakContainer(const void *self, TraceDescriptor strong_desc, TraceDescriptor weak_desc, WeakCallback callback, const void *data)
Definition: visitor.h:384
void TraceMultiple(const T *start, size_t len)
Definition: visitor.h:182
void RegisterWeakCallbackMethod(const T *object)
Definition: visitor.h:208
void TraceStrongContainer(const T *object)
Definition: visitor.h:308
void Trace(const WeakMember< T > &weak_member)
Definition: visitor.h:105
void Trace(const EphemeronPair< K, V > &ephemeron_pair)
Definition: visitor.h:219
Visitor(Key)
Definition: visitor.h:83
virtual ~Visitor()=default
virtual bool IsConcurrent() const
Definition: visitor.h:376
void TraceMultiple(const subtle::UncompressedMember< T > *start, size_t len)
Definition: visitor.h:139
Definition: cross-thread-persistent.h:74
Definition: persistent.h:54
Definition: member-storage.h:228
const void * LoadAtomic() const
Definition: member-storage.h:243
Definition: visitor.h:471
virtual void VisitWeakRoot(const void *self, TraceDescriptor, WeakCallback, const void *weak_root, SourceLocation)
Definition: visitor.h:507
virtual ~RootVisitor()=default
RootVisitor(Visitor::Key)
Definition: visitor.h:473
void Trace(const AnyWeakPersistentType &p)
Definition: visitor.h:493
void Trace(const AnyStrongPersistentType &p)
Definition: visitor.h:480
virtual void VisitRoot(const void *, TraceDescriptor, SourceLocation)
Definition: visitor.h:506
Definition: v8-source-location.h:22
#define CPPGC_DCHECK(condition)
Definition: logging.h:36
#define CPPGC_DISALLOW_NEW()
Definition: macros.h:14
Definition: allocation.h:38
void(*)(Visitor *visitor, const void *object) TraceCallback
Definition: trace-trait.h:37
TraceDescriptor(*)(const void *address) TraceDescriptorCallback
Definition: trace-trait.h:61
void(*)(const LivenessBroker &, const void *) WeakCallback
Definition: visitor.h:37
constexpr internal::SentinelPointer kSentinelPointer
Definition: sentinel-pointer.h:35
EphemeronPair(K *k, V *v)
Definition: visitor.h:47
WeakMember< K > key
Definition: visitor.h:48
void ClearValueIfKeyIsDead(const LivenessBroker &broker)
Definition: visitor.h:51
Member< V > value
Definition: visitor.h:49
void Trace(Visitor *visitor) const
Definition: visitor.h:465
Definition: trace-trait.h:43
const void * base_object_payload
Definition: trace-trait.h:48
Definition: trace-trait.h:104
Definition: custom-space.h:87
Definition: type-traits.h:111
#define V8_EXPORT
Definition: v8config.h:855
#define V8_WARN_UNUSED_RESULT
Definition: v8config.h:679