V8  latest master commit
V8 is Google's open source JavaScript engine
visitor.h
Go to the documentation of this file.
1 // Copyright 2020 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 INCLUDE_CPPGC_VISITOR_H_
6 #define INCLUDE_CPPGC_VISITOR_H_
7 
11 #include "cppgc/liveness-broker.h"
12 #include "cppgc/member.h"
13 #include "cppgc/source-location.h"
14 #include "cppgc/trace-trait.h"
15 
16 namespace cppgc {
17 namespace internal {
18 class VisitorBase;
19 } // namespace internal
20 
21 using WeakCallback = void (*)(const LivenessBroker&, const void*);
22 
27 class Visitor {
28  public:
29  template <typename T>
30  void Trace(const Member<T>& member) {
31  const T* value = member.GetRawAtomic();
33  Trace(value);
34  }
35 
36  template <typename T>
37  void Trace(const WeakMember<T>& weak_member) {
38  static_assert(sizeof(T), "T must be fully defined");
40  "T must be GarabgeCollected or GarbageCollectedMixin type");
41 
42  const T* value = weak_member.GetRawAtomic();
43 
44  // Bailout assumes that WeakMember emits write barrier.
45  if (!value) {
46  return;
47  }
48 
49  // TODO(chromium:1056170): DCHECK (or similar) for deleted values as they
50  // should come in at a different path.
52  &HandleWeak<WeakMember<T>>, &weak_member);
53  }
54 
55  template <typename Persistent,
56  std::enable_if_t<Persistent::IsStrongPersistent::value>* = nullptr>
57  void TraceRoot(const Persistent& p, const SourceLocation& loc) {
58  using PointeeType = typename Persistent::PointeeType;
59  static_assert(sizeof(PointeeType),
60  "Persistent's pointee type must be fully defined");
62  "Persisent's pointee type must be GarabgeCollected or "
63  "GarbageCollectedMixin");
64  if (!p.Get()) {
65  return;
66  }
68  }
69 
70  template <
71  typename WeakPersistent,
72  std::enable_if_t<!WeakPersistent::IsStrongPersistent::value>* = nullptr>
73  void TraceRoot(const WeakPersistent& p, const SourceLocation& loc) {
74  using PointeeType = typename WeakPersistent::PointeeType;
75  static_assert(sizeof(PointeeType),
76  "Persistent's pointee type must be fully defined");
78  "Persisent's pointee type must be GarabgeCollected or "
79  "GarbageCollectedMixin");
81  &HandleWeak<WeakPersistent>, &p);
82  }
83 
84  template <typename T, void (T::*method)(const LivenessBroker&)>
85  void RegisterWeakCallbackMethod(const T* obj) {
86  RegisterWeakCallback(&WeakCallbackMethodDelegate<T, method>, obj);
87  }
88 
89  virtual void RegisterWeakCallback(WeakCallback, const void*) {}
90 
91  protected:
92  virtual void Visit(const void* self, TraceDescriptor) {}
93  virtual void VisitWeak(const void* self, TraceDescriptor, WeakCallback,
94  const void* weak_member) {}
95  virtual void VisitRoot(const void*, TraceDescriptor) {}
96  virtual void VisitWeakRoot(const void* self, TraceDescriptor, WeakCallback,
97  const void* weak_root) {}
98 
99  private:
100  template <typename T, void (T::*method)(const LivenessBroker&)>
101  static void WeakCallbackMethodDelegate(const LivenessBroker& info,
102  const void* self) {
103  // Callback is registered through a potential const Trace method but needs
104  // to be able to modify fields. See HandleWeak.
105  (const_cast<T*>(static_cast<const T*>(self))->*method)(info);
106  }
107 
108  template <typename PointerType>
109  static void HandleWeak(const LivenessBroker& info, const void* object) {
110  const PointerType* weak = static_cast<const PointerType*>(object);
111  const auto* raw = weak->Get();
112  if (raw && !info.IsHeapObjectAlive(raw)) {
113  // Object is passed down through the marker as const. Alternatives are
114  // - non-const Trace method;
115  // - mutable pointer in MemberBase;
116  const_cast<PointerType*>(weak)->Clear();
117  }
118  }
119 
120  Visitor() = default;
121 
122  template <typename T>
123  void Trace(const T* t) {
124  static_assert(sizeof(T), "T must be fully defined");
125  static_assert(internal::IsGarbageCollectedType<T>::value,
126  "T must be GarabgeCollected or GarbageCollectedMixin type");
127  if (!t) {
128  return;
129  }
131  }
132 
133  friend class internal::VisitorBase;
134 };
135 
136 } // namespace cppgc
137 
138 #endif // INCLUDE_CPPGC_VISITOR_H_
cppgc::Visitor::VisitRoot
virtual void VisitRoot(const void *, TraceDescriptor)
Definition: visitor.h:95
cppgc::Persistent
internal::BasicPersistent< T, internal::StrongPersistentPolicy > Persistent
Definition: persistent.h:290
cppgc::Visitor::VisitWeakRoot
virtual void VisitWeakRoot(const void *self, TraceDescriptor, WeakCallback, const void *weak_root)
Definition: visitor.h:96
cppgc::TraceTrait::GetTraceDescriptor
static TraceDescriptor GetTraceDescriptor(const void *self)
Definition: trace-trait.h:38
cppgc::WeakPersistent
internal::BasicPersistent< T, internal::WeakPersistentPolicy > WeakPersistent
Definition: persistent.h:300
cppgc::SourceLocation
Definition: source-location.h:28
cppgc::Visitor::RegisterWeakCallback
virtual void RegisterWeakCallback(WeakCallback, const void *)
Definition: visitor.h:89
cppgc::Visitor::VisitWeak
virtual void VisitWeak(const void *self, TraceDescriptor, WeakCallback, const void *weak_member)
Definition: visitor.h:93
cppgc::Visitor::TraceRoot
void TraceRoot(const Persistent &p, const SourceLocation &loc)
Definition: visitor.h:57
garbage-collected.h
cppgc::internal::IsGarbageCollectedType
Definition: type-traits.h:83
cppgc::internal::BasicPersistent
Definition: pointer-policies.h:109
cppgc
Definition: allocation.h:18
cppgc::TraceDescriptor
Definition: trace-trait.h:27
cppgc::internal::BasicMember
Definition: pointer-policies.h:112
cppgc::LivenessBroker
Definition: liveness-broker.h:19
trace-trait.h
cppgc::Visitor::VisitorBase
friend class internal::VisitorBase
Definition: visitor.h:133
liveness-broker.h
pointer-policies.h
cppgc::Visitor
Definition: visitor.h:27
cppgc::Visitor::TraceRoot
void TraceRoot(const WeakPersistent &p, const SourceLocation &loc)
Definition: visitor.h:73
cppgc::Visitor::Visit
virtual void Visit(const void *self, TraceDescriptor)
Definition: visitor.h:92
cppgc::WeakCallback
void(*)(const LivenessBroker &, const void *) WeakCallback
Definition: visitor.h:21
cppgc::kSentinelPointer
constexpr internal::SentinelPointer kSentinelPointer
Definition: pointer-policies.h:129
logging.h
CPPGC_DCHECK
#define CPPGC_DCHECK(condition)
Definition: logging.h:36
cppgc::Visitor::Trace
void Trace(const Member< T > &member)
Definition: visitor.h:30
cppgc::internal::BasicPersistent::PointeeType
T PointeeType
Definition: persistent.h:28
cppgc::Visitor::RegisterWeakCallbackMethod
void RegisterWeakCallbackMethod(const T *obj)
Definition: visitor.h:85
cppgc::Visitor::Trace
void Trace(const WeakMember< T > &weak_member)
Definition: visitor.h:37
member.h
cppgc::TraceTrait
Definition: trace-trait.h:35
cppgc::internal::BasicPersistent::Get
T * Get() const
Definition: persistent.h:159
source-location.h