Loading...
Searching...
No Matches
member.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_MEMBER_H_
6#define INCLUDE_CPPGC_MEMBER_H_
7
8#include <atomic>
9#include <cstddef>
10#include <type_traits>
11
16#include "cppgc/type-traits.h"
17#include "v8config.h" // NOLINT(build/include_directory)
18
19namespace cppgc {
20
21namespace subtle {
22class HeapConsistency;
23template <typename, typename, typename>
24class TaggedUncompressedMember;
25} // namespace subtle
26
27class Visitor;
28
29namespace internal {
30
31// MemberBase always refers to the object as const object and defers to
32// BasicMember on casting to the right type as needed.
33template <typename StorageType>
35 public:
36 using RawStorage = StorageType;
37
38 protected:
40
41 V8_INLINE MemberBase() = default;
42 V8_INLINE explicit MemberBase(const void* value) : raw_(value) {}
44 : raw_(value, typename RawStorage::AtomicInitializerTag{}) {}
45
46 V8_INLINE explicit MemberBase(RawStorage raw) : raw_(raw) {}
47 V8_INLINE explicit MemberBase(std::nullptr_t) : raw_(nullptr) {}
48 V8_INLINE explicit MemberBase(SentinelPointer s) : raw_(s) {}
49
50 V8_INLINE const void** GetRawSlot() const {
51 return reinterpret_cast<const void**>(const_cast<MemberBase*>(this));
52 }
53 V8_INLINE const void* GetRaw() const { return raw_.Load(); }
54 V8_INLINE void SetRaw(void* value) { raw_.Store(value); }
55
56 V8_INLINE const void* GetRawAtomic() const { return raw_.LoadAtomic(); }
57 V8_INLINE void SetRawAtomic(const void* value) { raw_.StoreAtomic(value); }
58
59 V8_INLINE RawStorage GetRawStorage() const { return raw_; }
61 reinterpret_cast<std::atomic<RawStorage>&>(raw_).store(
62 other, std::memory_order_relaxed);
63 }
64
65 V8_INLINE bool IsCleared() const { return raw_.IsCleared(); }
66
67 V8_INLINE void ClearFromGC() const { raw_.Clear(); }
68
69 private:
70 friend class MemberDebugHelper;
71
72 mutable RawStorage raw_;
73};
74
75// The basic class from which all Member classes are 'generated'.
76template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
77 typename CheckingPolicy, typename StorageType>
78class V8_TRIVIAL_ABI BasicMember final : private MemberBase<StorageType>,
79 private CheckingPolicy {
81
82 public:
83 using PointeeType = T;
84 using RawStorage = typename Base::RawStorage;
85
86 V8_INLINE constexpr BasicMember() = default;
87 V8_INLINE constexpr BasicMember(std::nullptr_t) {} // NOLINT
89 V8_INLINE BasicMember(T* raw) : Base(raw) { // NOLINT
90 InitializingWriteBarrier(raw);
91 CheckPointer(raw);
92 }
93 V8_INLINE BasicMember(T& raw) // NOLINT
94 : BasicMember(&raw) {}
95
96 // Atomic ctor. Using the AtomicInitializerTag forces BasicMember to
97 // initialize using atomic assignments. This is required for preventing
98 // data races with concurrent marking.
101 : Base(nullptr, atomic) {}
103 : Base(s, atomic) {}
105 : Base(raw, atomic) {
106 InitializingWriteBarrier(raw);
107 CheckPointer(raw);
108 }
110 : BasicMember(&raw, atomic) {}
111
112 // Copy ctor.
114 : BasicMember(other.GetRawStorage()) {}
115
116 // Heterogeneous copy constructors. When the source pointer have a different
117 // type, perform a compress-decompress round, because the source pointer may
118 // need to be adjusted.
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)
125 : BasicMember(other.GetRawStorage()) {}
126
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)
133 : BasicMember(other.Get()) {}
134
135 // Move ctor.
137 : BasicMember(other.GetRawStorage()) {
138 other.Clear();
139 }
140
141 // Heterogeneous move constructors. When the source pointer have a different
142 // type, perform a compress-decompress round, because the source pointer may
143 // need to be adjusted.
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
150 : BasicMember(other.GetRawStorage()) {
151 other.Clear();
152 }
153
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
160 : BasicMember(other.Get()) {
161 other.Clear();
162 }
163
164 // Construction from Persistent.
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>>>
169 V8_INLINE BasicMember(const BasicPersistent<U, PersistentWeaknessPolicy,
170 PersistentLocationPolicy,
171 PersistentCheckingPolicy>& p)
172 : BasicMember(p.Get()) {}
173
174 // Copy assignment.
176 return operator=(other.GetRawStorage());
177 }
178
179 // Heterogeneous copy assignment. When the source pointer have a different
180 // type, perform a compress-decompress round, because the source pointer may
181 // need to be adjusted.
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());
189 } else {
190 static_assert(IsStrictlyBaseOfV<T, U>);
191 return operator=(other.Get());
192 }
193 }
194
195 // Move assignment.
197 operator=(other.GetRawStorage());
198 other.Clear();
199 return *this;
200 }
201
202 // Heterogeneous move assignment. When the source pointer have a different
203 // type, perform a compress-decompress round, because the source pointer may
204 // need to be adjusted.
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());
212 } else {
213 static_assert(IsStrictlyBaseOfV<T, U>);
214 operator=(other.Get());
215 }
216 other.Clear();
217 return *this;
218 }
219
220 // Assignment from Persistent.
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>>>
226 const BasicPersistent<U, PersistentWeaknessPolicy,
227 PersistentLocationPolicy, PersistentCheckingPolicy>&
228 other) {
229 return operator=(other.Get());
230 }
231
233 Base::SetRawAtomic(other);
234 AssigningWriteBarrier(other);
235 CheckPointer(other);
236 return *this;
237 }
238
239 V8_INLINE BasicMember& operator=(std::nullptr_t) {
240 Clear();
241 return *this;
242 }
244 Base::SetRawAtomic(s);
245 return *this;
246 }
247
248 template <typename OtherWeaknessTag, typename OtherBarrierPolicy,
249 typename OtherCheckingPolicy>
250 V8_INLINE void Swap(BasicMember<T, OtherWeaknessTag, OtherBarrierPolicy,
251 OtherCheckingPolicy, StorageType>& other) {
252 auto tmp = GetRawStorage();
253 *this = other;
254 other = tmp;
255 }
256
257 V8_INLINE explicit operator bool() const { return !Base::IsCleared(); }
258 V8_INLINE operator T*() const { return Get(); }
259 V8_INLINE T* operator->() const { return Get(); }
260 V8_INLINE T& operator*() const { return *Get(); }
261
262 // CFI cast exemption to allow passing SentinelPointer through T* and support
263 // heterogeneous assignments between different Member and Persistent handles
264 // based on their actual types.
265 V8_INLINE V8_CLANG_NO_SANITIZE("cfi-unrelated-cast") T* Get() const {
266 // Executed by the mutator, hence non atomic load.
267 //
268 // The const_cast below removes the constness from MemberBase storage. The
269 // following static_cast re-adds any constness if specified through the
270 // user-visible template parameter T.
271 return static_cast<T*>(const_cast<void*>(Base::GetRaw()));
272 }
273
274 V8_INLINE void Clear() { Base::SetRawStorageAtomic(RawStorage{}); }
275
277 T* result = Get();
278 Clear();
279 return result;
280 }
281
282 V8_INLINE const T** GetSlotForTesting() const {
283 return reinterpret_cast<const T**>(Base::GetRawSlot());
284 }
285
286 V8_INLINE RawStorage GetRawStorage() const { return Base::GetRawStorage(); }
287
288 private:
289 V8_INLINE explicit BasicMember(RawStorage raw) : Base(raw) {
290 InitializingWriteBarrier();
291 CheckPointer();
292 }
293
294 V8_INLINE BasicMember& operator=(RawStorage other) {
295 Base::SetRawStorageAtomic(other);
296 AssigningWriteBarrier();
297 CheckPointer();
298 return *this;
299 }
300
301 V8_INLINE const void* GetRawAtomic() const { return Base::GetRawAtomic(); }
302
303 V8_INLINE const T* GetAtomic() const {
304 return static_cast<const T*>(GetRawAtomic());
305 }
306
307 V8_INLINE void InitializingWriteBarrier(T* value) const {
308 WriteBarrierPolicy::InitializingBarrier(Base::GetRawSlot(), value);
309 }
310 V8_INLINE void InitializingWriteBarrier() const {
311 WriteBarrierPolicy::InitializingBarrier(Base::GetRawSlot(),
312 Base::GetRawStorage());
313 }
314 V8_INLINE void AssigningWriteBarrier(T* value) const {
315 WriteBarrierPolicy::template AssigningBarrier<
316 StorageType::kWriteBarrierSlotType>(Base::GetRawSlot(), value);
317 }
318 V8_INLINE void AssigningWriteBarrier() const {
319 WriteBarrierPolicy::template AssigningBarrier<
320 StorageType::kWriteBarrierSlotType>(Base::GetRawSlot(),
321 Base::GetRawStorage());
322 }
323 V8_INLINE void CheckPointer(T* value) {
324 CheckingPolicy::template CheckPointer<T>(value);
325 }
326 V8_INLINE void CheckPointer() {
327 CheckingPolicy::template CheckPointer<T>(Base::GetRawStorage());
328 }
329
330 V8_INLINE void ClearFromGC() const { Base::ClearFromGC(); }
331
332 V8_INLINE T* GetFromGC() const { return Get(); }
333
335 template <typename, typename, typename>
337 friend class cppgc::Visitor;
338 template <typename U>
339 friend struct cppgc::TraceTrait;
340 template <typename T1, typename WeaknessTag1, typename WriteBarrierPolicy1,
341 typename CheckingPolicy1, typename StorageType1>
342 friend class BasicMember;
343};
344
345// Member equality operators.
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>) {
356 // Check compressed pointers if types are the same.
357 return member1.GetRawStorage() == member2.GetRawStorage();
358 } else {
359 static_assert(IsStrictlyBaseOfV<T1, T2> || IsStrictlyBaseOfV<T2, T1>);
360 // Otherwise, check decompressed pointers.
361 return member1.Get() == member2.Get();
362 }
363}
364
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);
375}
376
377// Equality with raw pointers.
378template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
379 typename CheckingPolicy, typename StorageType, typename U>
381 const BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,
382 StorageType>& member,
383 U* raw) {
384 // Never allow comparison with erased pointers.
385 static_assert(!IsDecayedSameV<void, U>);
386
387 if constexpr (IsDecayedSameV<T, U>) {
388 // Check compressed pointers if types are the same.
389 return member.GetRawStorage() == StorageType(raw);
390 } else if constexpr (IsStrictlyBaseOfV<T, U>) {
391 // Cast the raw pointer to T, which may adjust the pointer.
392 return member.GetRawStorage() == StorageType(static_cast<T*>(raw));
393 } else {
394 // Otherwise, decompressed the member.
395 return member.Get() == raw;
396 }
397}
398
399template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
400 typename CheckingPolicy, typename StorageType, typename U>
402 const BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,
403 StorageType>& member,
404 U* raw) {
405 return !(member == raw);
406}
407
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;
415}
416
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);
424}
425
426// Equality with sentinel.
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();
434}
435
436template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
437 typename CheckingPolicy, typename StorageType>
439 const BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,
440 StorageType>& member,
441 SentinelPointer s) {
442 return !(member == s);
443}
444
445template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
446 typename CheckingPolicy, typename StorageType>
448 SentinelPointer s, const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
449 CheckingPolicy, StorageType>& member) {
450 return member == s;
451}
452
453template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
454 typename CheckingPolicy, typename StorageType>
456 SentinelPointer s, const BasicMember<T, WeaknessTag, WriteBarrierPolicy,
457 CheckingPolicy, StorageType>& member) {
458 return !(s == member);
459}
460
461// Equality with nullptr.
462template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
463 typename CheckingPolicy, typename StorageType>
465 const BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,
466 StorageType>& member,
467 std::nullptr_t) {
468 return !static_cast<bool>(member);
469}
470
471template <typename T, typename WeaknessTag, typename WriteBarrierPolicy,
472 typename CheckingPolicy, typename StorageType>
474 const BasicMember<T, WeaknessTag, WriteBarrierPolicy, CheckingPolicy,
475 StorageType>& member,
476 std::nullptr_t n) {
477 return !(member == n);
478}
479
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) {
485 return member == n;
486}
487
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);
494}
495
496// Relational operators.
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) {
506 static_assert(
507 IsDecayedSameV<T1, T2>,
508 "Comparison works only for same pointer type modulo cv-qualifiers");
509 return member1.GetRawStorage() < member2.GetRawStorage();
510}
511
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) {
521 static_assert(
522 IsDecayedSameV<T1, T2>,
523 "Comparison works only for same pointer type modulo cv-qualifiers");
524 return member1.GetRawStorage() <= member2.GetRawStorage();
525}
526
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) {
536 static_assert(
537 IsDecayedSameV<T1, T2>,
538 "Comparison works only for same pointer type modulo cv-qualifiers");
539 return member1.GetRawStorage() > member2.GetRawStorage();
540}
541
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) {
551 static_assert(
552 IsDecayedSameV<T1, T2>,
553 "Comparison works only for same pointer type modulo cv-qualifiers");
554 return member1.GetRawStorage() >= member2.GetRawStorage();
555}
556
557template <typename T, typename WriteBarrierPolicy, typename CheckingPolicy,
558 typename StorageType>
559struct IsWeak<BasicMember<T, WeakMemberTag, WriteBarrierPolicy, CheckingPolicy,
560 StorageType>> : std::true_type {};
561
562} // namespace internal
563
569template <typename T>
571 T, internal::StrongMemberTag, internal::DijkstraWriteBarrierPolicy,
573
582template <typename T>
584 T, internal::WeakMemberTag, internal::DijkstraWriteBarrierPolicy,
586
593template <typename T>
595 T, internal::UntracedMemberTag, internal::NoWriteBarrierPolicy,
597
598namespace subtle {
599
604template <typename T>
606 T, internal::StrongMemberTag, internal::DijkstraWriteBarrierPolicy,
608
609#if defined(CPPGC_POINTER_COMPRESSION)
614template <typename T>
615using CompressedMember = internal::BasicMember<
616 T, internal::StrongMemberTag, internal::DijkstraWriteBarrierPolicy,
617 internal::DefaultMemberCheckingPolicy, internal::CompressedPointer>;
618#endif // defined(CPPGC_POINTER_COMPRESSION)
619
620} // namespace subtle
621
622namespace internal {
623
624struct Dummy;
625
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>);
632#endif // defined(CPPGC_POINTER_COMPRESSION)
633
634} // namespace internal
635
636} // namespace cppgc
637
638// Mark `BasicMember<T>` and `T*` as having a common reference type of `T*` (the
639// type to which both can be converted or bound). This makes them satisfy
640// `std::equality_comparable`, which allows usage like the following:
641// ```
642// HeapVector<Member<T>> v;
643// T* e;
644// auto it = std::ranges::find(v, e);
645// ```
646// Without this, the `find()` call above would fail to compile with an error
647// about being unable to invoke `std::ranges::equal_to()`.
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>,
654 T*, TQ, UQ> {
655 using type = T*;
656};
657
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<
662 T*,
663 cppgc::internal::BasicMember<T, WeaknessTag, WriteBarrierPolicy,
664 CheckingPolicy, StorageType>,
665 TQ, UQ> {
666 using type = T*;
667};
668
669#endif // INCLUDE_CPPGC_MEMBER_H_
Definition: visitor.h:75
Definition: member.h:79
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
Definition: member.h:34
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
#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