5#ifndef INCLUDE_CPPGC_MEMBER_H_
6#define INCLUDE_CPPGC_MEMBER_H_
23template <
typename,
typename,
typename>
24class TaggedUncompressedMember;
33template <
typename StorageType>
51 return reinterpret_cast<const void**
>(
const_cast<MemberBase*
>(
this));
61 reinterpret_cast<std::atomic<RawStorage>&
>(raw_).store(
62 other, std::memory_order_relaxed);
70 friend class MemberDebugHelper;
76template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
77 typename CheckingPolicy,
typename StorageType>
79 private CheckingPolicy {
90 InitializingWriteBarrier(raw);
101 :
Base(nullptr, atomic) {}
105 :
Base(raw, atomic) {
106 InitializingWriteBarrier(raw);
119 template <
typename U,
typename OtherBarrierPolicy,
typename OtherWeaknessTag,
120 typename OtherCheckingPolicy,
121 std::enable_if_t<IsDecayedSameV<T, U>>* =
nullptr>
123 const BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
124 OtherCheckingPolicy, StorageType>& other)
127 template <
typename U,
typename OtherBarrierPolicy,
typename OtherWeaknessTag,
128 typename OtherCheckingPolicy,
129 std::enable_if_t<IsStrictlyBaseOfV<T, U>>* =
nullptr>
131 const BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
132 OtherCheckingPolicy, StorageType>& other)
144 template <
typename U,
typename OtherBarrierPolicy,
typename OtherWeaknessTag,
145 typename OtherCheckingPolicy,
146 std::enable_if_t<IsDecayedSameV<T, U>>* =
nullptr>
148 BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy, OtherCheckingPolicy,
149 StorageType>&& other) noexcept
154 template <
typename U,
typename OtherBarrierPolicy,
typename OtherWeaknessTag,
155 typename OtherCheckingPolicy,
156 std::enable_if_t<IsStrictlyBaseOfV<T, U>>* =
nullptr>
158 BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy, OtherCheckingPolicy,
159 StorageType>&& other) noexcept
165 template <
typename U,
typename PersistentWeaknessPolicy,
166 typename PersistentLocationPolicy,
167 typename PersistentCheckingPolicy,
168 typename = std::enable_if_t<std::is_base_of_v<T, U>>>
170 PersistentLocationPolicy,
171 PersistentCheckingPolicy>& p)
182 template <
typename U,
typename OtherWeaknessTag,
typename OtherBarrierPolicy,
183 typename OtherCheckingPolicy>
185 const BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy,
186 OtherCheckingPolicy, StorageType>& other) {
187 if constexpr (IsDecayedSameV<T, U>) {
188 return operator=(other.GetRawStorage());
190 static_assert(IsStrictlyBaseOfV<T, U>);
191 return operator=(other.Get());
197 operator=(other.GetRawStorage());
205 template <
typename U,
typename OtherWeaknessTag,
typename OtherBarrierPolicy,
206 typename OtherCheckingPolicy>
208 BasicMember<U, OtherWeaknessTag, OtherBarrierPolicy, OtherCheckingPolicy,
209 StorageType>&& other)
noexcept {
210 if constexpr (IsDecayedSameV<T, U>) {
211 operator=(other.GetRawStorage());
213 static_assert(IsStrictlyBaseOfV<T, U>);
214 operator=(other.Get());
221 template <
typename U,
typename PersistentWeaknessPolicy,
222 typename PersistentLocationPolicy,
223 typename PersistentCheckingPolicy,
224 typename = std::enable_if_t<std::is_base_of_v<T, U>>>
227 PersistentLocationPolicy, PersistentCheckingPolicy>&
229 return operator=(other.Get());
233 Base::SetRawAtomic(other);
234 AssigningWriteBarrier(other);
244 Base::SetRawAtomic(s);
248 template <
typename OtherWeaknessTag,
typename OtherBarrierPolicy,
249 typename OtherCheckingPolicy>
251 OtherCheckingPolicy, StorageType>& other) {
252 auto tmp = GetRawStorage();
257 V8_INLINE explicit operator bool()
const {
return !Base::IsCleared(); }
271 return static_cast<T*
>(
const_cast<void*
>(Base::GetRaw()));
283 return reinterpret_cast<const T**
>(Base::GetRawSlot());
290 InitializingWriteBarrier();
294 V8_INLINE BasicMember& operator=(RawStorage other) {
295 Base::SetRawStorageAtomic(other);
296 AssigningWriteBarrier();
301 V8_INLINE const void* GetRawAtomic()
const {
return Base::GetRawAtomic(); }
304 return static_cast<const T*
>(GetRawAtomic());
307 V8_INLINE void InitializingWriteBarrier(T* value)
const {
308 WriteBarrierPolicy::InitializingBarrier(Base::GetRawSlot(), value);
310 V8_INLINE void InitializingWriteBarrier()
const {
311 WriteBarrierPolicy::InitializingBarrier(Base::GetRawSlot(),
312 Base::GetRawStorage());
314 V8_INLINE void AssigningWriteBarrier(T* value)
const {
315 WriteBarrierPolicy::template AssigningBarrier<
316 StorageType::kWriteBarrierSlotType>(Base::GetRawSlot(), value);
318 V8_INLINE void AssigningWriteBarrier()
const {
319 WriteBarrierPolicy::template AssigningBarrier<
320 StorageType::kWriteBarrierSlotType>(Base::GetRawSlot(),
321 Base::GetRawStorage());
324 CheckingPolicy::template CheckPointer<T>(value);
327 CheckingPolicy::template CheckPointer<T>(Base::GetRawStorage());
330 V8_INLINE void ClearFromGC()
const { Base::ClearFromGC(); }
332 V8_INLINE T* GetFromGC()
const {
return Get(); }
335 template <
typename,
typename,
typename>
338 template <
typename U>
340 template <
typename T1,
typename WeaknessTag1,
typename WriteBarrierPolicy1,
341 typename CheckingPolicy1,
typename StorageType1>
346template <
typename T1,
typename WeaknessTag1,
typename WriteBarrierPolicy1,
347 typename CheckingPolicy1,
typename T2,
typename WeaknessTag2,
348 typename WriteBarrierPolicy2,
typename CheckingPolicy2,
349 typename StorageType>
351 const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1,
352 StorageType>& member1,
353 const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2,
354 StorageType>& member2) {
355 if constexpr (IsDecayedSameV<T1, T2>) {
357 return member1.GetRawStorage() == member2.GetRawStorage();
359 static_assert(IsStrictlyBaseOfV<T1, T2> || IsStrictlyBaseOfV<T2, T1>);
361 return member1.Get() == member2.Get();
365template <
typename T1,
typename WeaknessTag1,
typename WriteBarrierPolicy1,
366 typename CheckingPolicy1,
typename T2,
typename WeaknessTag2,
367 typename WriteBarrierPolicy2,
typename CheckingPolicy2,
368 typename StorageType>
370 const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1,
371 StorageType>& member1,
372 const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2,
373 StorageType>& member2) {
374 return !(member1 == member2);
378template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
379 typename CheckingPolicy,
typename StorageType,
typename U>
381 const BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,
382 StorageType>& member,
385 static_assert(!IsDecayedSameV<void, U>);
387 if constexpr (IsDecayedSameV<T, U>) {
389 return member.GetRawStorage() == StorageType(raw);
390 }
else if constexpr (IsStrictlyBaseOfV<T, U>) {
392 return member.GetRawStorage() == StorageType(
static_cast<T*
>(raw));
395 return member.Get() == raw;
399template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
400 typename CheckingPolicy,
typename StorageType,
typename U>
402 const BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,
403 StorageType>& member,
405 return !(member == raw);
408template <
typename T,
typename U,
typename WeaknessTag,
409 typename WriteBarrierPolicy,
typename CheckingPolicy,
410 typename StorageType>
412 T* raw,
const BasicMember<U, WeaknessTag, WriteBarrierPolicy,
413 CheckingPolicy, StorageType>& member) {
414 return member == raw;
417template <
typename T,
typename U,
typename WeaknessTag,
418 typename WriteBarrierPolicy,
typename CheckingPolicy,
419 typename StorageType>
421 T* raw,
const BasicMember<U, WeaknessTag, WriteBarrierPolicy,
422 CheckingPolicy, StorageType>& member) {
423 return !(raw == member);
427template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
428 typename CheckingPolicy,
typename StorageType>
430 const BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,
431 StorageType>& member,
433 return member.GetRawStorage().IsSentinel();
436template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
437 typename CheckingPolicy,
typename StorageType>
439 const BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,
440 StorageType>& member,
442 return !(member == s);
445template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
446 typename CheckingPolicy,
typename StorageType>
449 CheckingPolicy, StorageType>& member) {
453template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
454 typename CheckingPolicy,
typename StorageType>
457 CheckingPolicy, StorageType>& member) {
458 return !(s == member);
462template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
463 typename CheckingPolicy,
typename StorageType>
465 const BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,
466 StorageType>& member,
468 return !
static_cast<bool>(member);
471template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
472 typename CheckingPolicy,
typename StorageType>
474 const BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,
475 StorageType>& member,
477 return !(member == n);
480template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
481 typename CheckingPolicy,
typename StorageType>
483 std::nullptr_t n,
const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
484 CheckingPolicy, StorageType>& member) {
488template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
489 typename CheckingPolicy,
typename StorageType>
491 std::nullptr_t n,
const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
492 CheckingPolicy, StorageType>& member) {
493 return !(n == member);
497template <
typename T1,
typename WeaknessTag1,
typename WriteBarrierPolicy1,
498 typename CheckingPolicy1,
typename T2,
typename WeaknessTag2,
499 typename WriteBarrierPolicy2,
typename CheckingPolicy2,
500 typename StorageType>
502 const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1,
503 StorageType>& member1,
504 const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2,
505 StorageType>& member2) {
507 IsDecayedSameV<T1, T2>,
508 "Comparison works only for same pointer type modulo cv-qualifiers");
509 return member1.GetRawStorage() < member2.GetRawStorage();
512template <
typename T1,
typename WeaknessTag1,
typename WriteBarrierPolicy1,
513 typename CheckingPolicy1,
typename T2,
typename WeaknessTag2,
514 typename WriteBarrierPolicy2,
typename CheckingPolicy2,
515 typename StorageType>
517 const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1,
518 StorageType>& member1,
519 const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2,
520 StorageType>& member2) {
522 IsDecayedSameV<T1, T2>,
523 "Comparison works only for same pointer type modulo cv-qualifiers");
524 return member1.GetRawStorage() <= member2.GetRawStorage();
527template <
typename T1,
typename WeaknessTag1,
typename WriteBarrierPolicy1,
528 typename CheckingPolicy1,
typename T2,
typename WeaknessTag2,
529 typename WriteBarrierPolicy2,
typename CheckingPolicy2,
530 typename StorageType>
532 const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1,
533 StorageType>& member1,
534 const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2,
535 StorageType>& member2) {
537 IsDecayedSameV<T1, T2>,
538 "Comparison works only for same pointer type modulo cv-qualifiers");
539 return member1.GetRawStorage() > member2.GetRawStorage();
542template <
typename T1,
typename WeaknessTag1,
typename WriteBarrierPolicy1,
543 typename CheckingPolicy1,
typename T2,
typename WeaknessTag2,
544 typename WriteBarrierPolicy2,
typename CheckingPolicy2,
545 typename StorageType>
547 const BasicMember<T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1,
548 StorageType>& member1,
549 const BasicMember<T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2,
550 StorageType>& member2) {
552 IsDecayedSameV<T1, T2>,
553 "Comparison works only for same pointer type modulo cv-qualifiers");
554 return member1.GetRawStorage() >= member2.GetRawStorage();
557template <
typename T,
typename WriteBarrierPolicy,
typename CheckingPolicy,
558 typename StorageType>
560 StorageType>> : std::true_type {};
609#if defined(CPPGC_POINTER_COMPRESSION)
626static constexpr size_t kSizeOfMember =
sizeof(
Member<Dummy>);
627static constexpr size_t kSizeOfUncompressedMember =
629#if defined(CPPGC_POINTER_COMPRESSION)
630static constexpr size_t kSizeofCompressedMember =
631 sizeof(subtle::CompressedMember<Dummy>);
648template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
649 typename CheckingPolicy,
typename StorageType,
650 template <
typename>
typename TQ,
template <
typename>
typename UQ>
651struct std::basic_common_reference<
652 cppgc::internal::BasicMember<T, WeaknessTag, WriteBarrierPolicy,
653 CheckingPolicy, StorageType>,
658template <
typename T,
typename WeaknessTag,
typename WriteBarrierPolicy,
659 typename CheckingPolicy,
typename StorageType,
660 template <
typename>
typename TQ,
template <
typename>
typename UQ>
661struct std::basic_common_reference<
664 CheckingPolicy, StorageType>,
BasicMember & operator=(const BasicMember< U, OtherWeaknessTag, OtherBarrierPolicy, OtherCheckingPolicy, StorageType > &other)
Definition: member.h:184
T PointeeType
Definition: member.h:83
BasicMember & operator=(BasicMember &&other) noexcept
Definition: member.h:196
T & operator*() const
Definition: member.h:260
BasicMember(SentinelPointer s)
Definition: member.h:88
BasicMember(T *raw)
Definition: member.h:89
BasicMember & operator=(T *other)
Definition: member.h:232
void Clear()
Definition: member.h:274
T * operator->() const
Definition: member.h:259
constexpr BasicMember()=default
BasicMember & operator=(const BasicMember &other)
Definition: member.h:175
const T ** GetSlotForTesting() const
Definition: member.h:282
BasicMember(SentinelPointer s, AtomicInitializerTag atomic)
Definition: member.h:102
RawStorage GetRawStorage() const
Definition: member.h:286
BasicMember & operator=(BasicMember< U, OtherWeaknessTag, OtherBarrierPolicy, OtherCheckingPolicy, StorageType > &&other) noexcept
Definition: member.h:207
BasicMember(const BasicPersistent< U, PersistentWeaknessPolicy, PersistentLocationPolicy, PersistentCheckingPolicy > &p)
Definition: member.h:169
BasicMember(T &raw)
Definition: member.h:93
BasicMember(T *raw, AtomicInitializerTag atomic)
Definition: member.h:104
BasicMember(const BasicMember &other)
Definition: member.h:113
BasicMember & operator=(std::nullptr_t)
Definition: member.h:239
BasicMember(const BasicMember< U, OtherWeaknessTag, OtherBarrierPolicy, OtherCheckingPolicy, StorageType > &other)
Definition: member.h:122
T * Release()
Definition: member.h:276
void Swap(BasicMember< T, OtherWeaknessTag, OtherBarrierPolicy, OtherCheckingPolicy, StorageType > &other)
Definition: member.h:250
typename Base::RawStorage RawStorage
Definition: member.h:84
BasicMember(T &raw, AtomicInitializerTag atomic)
Definition: member.h:109
BasicMember(BasicMember &&other) noexcept
Definition: member.h:136
constexpr BasicMember(std::nullptr_t)
Definition: member.h:87
BasicMember(BasicMember< U, OtherWeaknessTag, OtherBarrierPolicy, OtherCheckingPolicy, StorageType > &&other) noexcept
Definition: member.h:147
BasicMember & operator=(const BasicPersistent< U, PersistentWeaknessPolicy, PersistentLocationPolicy, PersistentCheckingPolicy > &other)
Definition: member.h:225
BasicMember & operator=(SentinelPointer s)
Definition: member.h:243
typename Base::AtomicInitializerTag AtomicInitializerTag
Definition: member.h:99
BasicMember(std::nullptr_t, AtomicInitializerTag atomic)
Definition: member.h:100
Definition: persistent.h:54
MemberBase(RawStorage raw)
Definition: member.h:46
MemberBase(SentinelPointer s)
Definition: member.h:48
const void * GetRawAtomic() const
Definition: member.h:56
void SetRawStorageAtomic(RawStorage other)
Definition: member.h:60
MemberBase(std::nullptr_t)
Definition: member.h:47
void SetRaw(void *value)
Definition: member.h:54
MemberBase(const void *value)
Definition: member.h:42
MemberBase(const void *value, AtomicInitializerTag)
Definition: member.h:43
const void * GetRaw() const
Definition: member.h:53
bool IsCleared() const
Definition: member.h:65
void SetRawAtomic(const void *value)
Definition: member.h:57
StorageType RawStorage
Definition: member.h:36
void ClearFromGC() const
Definition: member.h:67
RawStorage GetRawStorage() const
Definition: member.h:59
const void ** GetRawSlot() const
Definition: member.h:50
Definition: member-storage.h:228
Definition: heap-consistency.h:28
Definition: tagged-member.h:31
bool operator<=(const BasicMember< T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1, StorageType > &member1, const BasicMember< T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2, StorageType > &member2)
Definition: member.h:516
bool operator!=(const BasicMember< T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1, StorageType > &member1, const BasicMember< T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2, StorageType > &member2)
Definition: member.h:369
bool operator>(const BasicMember< T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1, StorageType > &member1, const BasicMember< T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2, StorageType > &member2)
Definition: member.h:531
bool operator==(const BasicMember< T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1, StorageType > &member1, const BasicMember< T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2, StorageType > &member2)
Definition: member.h:350
bool operator>=(const BasicMember< T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1, StorageType > &member1, const BasicMember< T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2, StorageType > &member2)
Definition: member.h:546
bool operator<(const BasicMember< T1, WeaknessTag1, WriteBarrierPolicy1, CheckingPolicy1, StorageType > &member1, const BasicMember< T2, WeaknessTag2, WriteBarrierPolicy2, CheckingPolicy2, StorageType > &member2)
Definition: member.h:501
DisabledCheckingPolicy DefaultMemberCheckingPolicy
Definition: pointer-policies.h:196
Definition: allocation.h:38
Definition: trace-trait.h:104
Definition: pointer-policies.h:30
Definition: type-traits.h:30
Definition: pointer-policies.h:108
Definition: sentinel-pointer.h:17
T * type
Definition: member.h:666
T * type
Definition: member.h:655
#define V8_INLINE
Definition: v8config.h:500
#define V8_CLANG_NO_SANITIZE(what)
defined(V8_TRIVIAL_ABI)
Definition: v8config.h:765
#define V8_TRIVIAL_ABI
Definition: v8config.h:754