5#ifndef INCLUDE_CPPGC_PERSISTENT_H_
6#define INCLUDE_CPPGC_PERSISTENT_H_
42 mutable const void*
raw_ =
nullptr;
49template <
typename T,
typename WeaknessPolicy,
typename LocationPolicy,
50 typename CheckingPolicy>
52 public LocationPolicy,
53 private WeaknessPolicy,
54 private CheckingPolicy {
56 using typename WeaknessPolicy::IsStrongPersistent;
62 : LocationPolicy(loc) {}
66 : LocationPolicy(loc) {}
76 if (!IsValid())
return;
78 .AllocateNode(
this, &TraceAsRoot));
79 this->CheckPointer(Get());
92 template <
typename U,
typename OtherWeaknessPolicy,
93 typename OtherLocationPolicy,
typename OtherCheckingPolicy,
94 typename = std::enable_if_t<std::is_base_of<T, U>::value>>
97 OtherCheckingPolicy>& other,
106 :
PersistentBase(std::move(other)), LocationPolicy(std::move(other)) {
107 if (!IsValid())
return;
109 other.SetValue(
nullptr);
110 other.SetNode(
nullptr);
111 this->CheckPointer(Get());
115 template <
typename U,
typename MemberBarrierPolicy,
116 typename MemberWeaknessTag,
typename MemberCheckingPolicy,
117 typename MemberStorageType,
118 typename = std::enable_if_t<std::is_base_of<T, U>::value>>
120 U, MemberBarrierPolicy, MemberWeaknessTag,
121 MemberCheckingPolicy, MemberStorageType>& member,
132 template <
typename U,
typename OtherWeaknessPolicy,
133 typename OtherLocationPolicy,
typename OtherCheckingPolicy,
134 typename = std::enable_if_t<std::is_base_of<T, U>::value>>
137 OtherCheckingPolicy>& other) {
143 if (
this == &other)
return *
this;
145 PersistentBase::operator=(std::move(other));
146 LocationPolicy::operator=(std::move(other));
147 if (!IsValid())
return *
this;
151 this->CheckPointer(Get());
156 template <
typename U,
typename MemberBarrierPolicy,
157 typename MemberWeaknessTag,
typename MemberCheckingPolicy,
158 typename MemberStorageType,
159 typename = std::enable_if_t<std::is_base_of<T, U>::value>>
162 MemberCheckingPolicy, MemberStorageType>&
182 explicit operator bool()
const {
return Get(); }
183 operator T*()
const {
return Get(); }
194 return static_cast<T*
>(
const_cast<void*
>(
GetValue()));
213 template <
typename U,
typename OtherWeaknessPolicy = WeaknessPolicy,
214 typename OtherLocationPolicy = LocationPolicy,
215 typename OtherCheckingPolicy = CheckingPolicy>
220 OtherCheckingPolicy>(
static_cast<U*
>(Get()));
224 static void TraceAsRoot(
RootVisitor& root_visitor,
const void* ptr) {
228 bool IsValid()
const {
235 void Assign(T* ptr) {
240 this->CheckPointer(ptr);
247 if (!IsValid())
return;
249 .AllocateNode(
this, &TraceAsRoot));
250 this->CheckPointer(Get());
253 void ClearFromGC()
const {
262 T* GetFromGC()
const {
263 return static_cast<T*
>(
const_cast<void*
>(
GetValue()));
269template <
typename T1,
typename WeaknessPolicy1,
typename LocationPolicy1,
270 typename CheckingPolicy1,
typename T2,
typename WeaknessPolicy2,
271 typename LocationPolicy2,
typename CheckingPolicy2>
273 CheckingPolicy1>& p1,
275 CheckingPolicy2>& p2) {
276 return p1.Get() == p2.Get();
279template <
typename T1,
typename WeaknessPolicy1,
typename LocationPolicy1,
280 typename CheckingPolicy1,
typename T2,
typename WeaknessPolicy2,
281 typename LocationPolicy2,
typename CheckingPolicy2>
283 CheckingPolicy1>& p1,
285 CheckingPolicy2>& p2) {
289template <
typename T1,
typename PersistentWeaknessPolicy,
290 typename PersistentLocationPolicy,
typename PersistentCheckingPolicy,
291 typename T2,
typename MemberWriteBarrierPolicy,
292 typename MemberWeaknessTag,
typename MemberCheckingPolicy,
293 typename MemberStorageType>
296 PersistentLocationPolicy, PersistentCheckingPolicy>&
298 const BasicMember<T2, MemberWeaknessTag, MemberWriteBarrierPolicy,
299 MemberCheckingPolicy, MemberStorageType>& m) {
300 return p.Get() == m.Get();
303template <
typename T1,
typename PersistentWeaknessPolicy,
304 typename PersistentLocationPolicy,
typename PersistentCheckingPolicy,
305 typename T2,
typename MemberWriteBarrierPolicy,
306 typename MemberWeaknessTag,
typename MemberCheckingPolicy,
307 typename MemberStorageType>
310 PersistentLocationPolicy, PersistentCheckingPolicy>&
312 const BasicMember<T2, MemberWeaknessTag, MemberWriteBarrierPolicy,
313 MemberCheckingPolicy, MemberStorageType>& m) {
317template <
typename T1,
typename MemberWriteBarrierPolicy,
318 typename MemberWeaknessTag,
typename MemberCheckingPolicy,
319 typename MemberStorageType,
typename T2,
320 typename PersistentWeaknessPolicy,
typename PersistentLocationPolicy,
321 typename PersistentCheckingPolicy>
323 const BasicMember<T2, MemberWeaknessTag, MemberWriteBarrierPolicy,
324 MemberCheckingPolicy, MemberStorageType>& m,
326 PersistentLocationPolicy, PersistentCheckingPolicy>&
328 return m.Get() == p.Get();
331template <
typename T1,
typename MemberWriteBarrierPolicy,
332 typename MemberWeaknessTag,
typename MemberCheckingPolicy,
333 typename MemberStorageType,
typename T2,
334 typename PersistentWeaknessPolicy,
typename PersistentLocationPolicy,
335 typename PersistentCheckingPolicy>
337 const BasicMember<T2, MemberWeaknessTag, MemberWriteBarrierPolicy,
338 MemberCheckingPolicy, MemberStorageType>& m,
340 PersistentLocationPolicy, PersistentCheckingPolicy>&
345template <
typename T,
typename LocationPolicy,
typename CheckingPolicy>
347 CheckingPolicy>> : std::true_type {};
static constexpr SourceLocation Current()
BasicPersistent & operator=(BasicPersistent &&other) noexcept
BasicPersistent(BasicPersistent &&other, const SourceLocation &loc=SourceLocation::Current()) noexcept
BasicPersistent(T *raw, const SourceLocation &loc=SourceLocation::Current())
BasicPersistent(const BasicPersistent &other, const SourceLocation &loc=SourceLocation::Current())
BasicPersistent(std::nullptr_t, const SourceLocation &loc=SourceLocation::Current())
BasicPersistent & operator=(T *other)
V8_CLANG_NO_SANITIZE("cfi-unrelated-cast") T *Get() const
BasicPersistent & operator=(std::nullptr_t)
BasicPersistent & operator=(SentinelPointer s)
BasicPersistent< U, OtherWeaknessPolicy, OtherLocationPolicy, OtherCheckingPolicy > To() const
BasicPersistent(const BasicPersistent< U, OtherWeaknessPolicy, OtherLocationPolicy, OtherCheckingPolicy > &other, const SourceLocation &loc=SourceLocation::Current())
BasicPersistent & operator=(const BasicPersistent &other)
BasicPersistent & operator=(const BasicPersistent< U, OtherWeaknessPolicy, OtherLocationPolicy, OtherCheckingPolicy > &other)
BasicPersistent(const SourceLocation &loc=SourceLocation::Current())
BasicPersistent(T &raw, const SourceLocation &loc=SourceLocation::Current())
BasicPersistent & operator=(const internal::BasicMember< U, MemberBarrierPolicy, MemberWeaknessTag, MemberCheckingPolicy, MemberStorageType > &member)
BasicPersistent(SentinelPointer s, const SourceLocation &loc=SourceLocation::Current())
BasicPersistent(const internal::BasicMember< U, MemberBarrierPolicy, MemberWeaknessTag, MemberCheckingPolicy, MemberStorageType > &member, const SourceLocation &loc=SourceLocation::Current())
const void * GetValue() const
PersistentBase(const void *raw)
void SetValue(const void *value)
PersistentNode * GetNode() const
void SetNode(PersistentNode *node)
void UpdateOwner(void *owner)
void Trace(const AnyStrongPersistentType &p)
V8_INLINE bool operator==(const BasicMember< T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1, StorageType > &member1, const BasicMember< T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2, StorageType > &member2)
V8_INLINE bool operator!=(const BasicMember< T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1, StorageType > &member1, const BasicMember< T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2, StorageType > &member2)
constexpr internal::SentinelPointer kSentinelPointer
#define V8_CLANG_NO_SANITIZE(what)
defined(V8_TRIVIAL_ABI)