5#ifndef V8_OBJECTS_TAGGED_FIELD_H_
6#define V8_OBJECTS_TAGGED_FIELD_H_
21template <
typename T,
typename CompressionScheme = V8HeapCompressionScheme>
29template <
typename T,
typename CompressionScheme>
93static_assert(
alignof(UnalignedDoubleMember) ==
alignof(
Tagged_t));
94static_assert(
sizeof(UnalignedDoubleMember) ==
sizeof(double));
117#if V8_CC_MSVC && !defined(__clang__)
121#define FLEXIBLE_ARRAY_MEMBER(Type, name) \
122 using FlexibleDataReturnType = Type[0]; \
123 FlexibleDataReturnType& name() { \
124 static_assert(alignof(Type) <= alignof(decltype(*this))); \
125 using ReturnType = Type[0]; \
126 return reinterpret_cast<ReturnType&>(*(this + 1)); \
128 const FlexibleDataReturnType& name() const { \
129 static_assert(alignof(Type) <= alignof(decltype(*this))); \
130 using ReturnType = Type[0]; \
131 return reinterpret_cast<const ReturnType&>(*(this + 1)); \
133 using FlexibleDataType = Type
138#define FLEXIBLE_ARRAY_MEMBER(Type, name) \
139 using FlexibleDataReturnType = Type[0]; \
140 FlexibleDataReturnType& name() { return flexible_array_member_data_; } \
141 const FlexibleDataReturnType& name() const { \
142 return flexible_array_member_data_; \
144 Type flexible_array_member_data_[0]; \
147 template <typename Class> \
148 static constexpr auto OffsetOfDataStart() { \
150 static_assert(base::tmp::lazy_true< \
151 decltype(std::declval<Class>() \
152 .flexible_array_member_data_)>::value); \
153 return static_cast<int>(offsetof(Class, flexible_array_member_data_)); \
157 using FlexibleDataType = Type
162#if V8_CC_MSVC && !defined(__clang__)
163#define OFFSET_OF_DATA_START(Type) sizeof(Type)
165#define OFFSET_OF_DATA_START(Type) Type::template OffsetOfDataStart<Type>()
173template <
typename T,
int kFieldOffset = 0,
178 "T must be strong or weak tagged type or MapWord");
181 static constexpr bool kIsSmi = std::is_same<Smi, T>::value;
257 template <
typename TOnHeapAddress>
267template <
typename T,
int kFieldOffset>
271template <
typename T,
int kFieldOffset,
typename CompressionScheme>
273 :
public TaggedField<T, kFieldOffset, CompressionScheme> {};
static void SeqCst_Store(Tagged< HeapObject > host, PtrType value)
static Tagged_t Relaxed_CompareAndSwap(Tagged< HeapObject > host, PtrType old, PtrType value)
static void Release_Store(Tagged< HeapObject > host, PtrType value)
std::conditional_t< std::is_same_v< MapWord, T >, MapWord, Tagged< T > > PtrType
static PtrType load(Tagged< HeapObject > host, int offset=0)
static void Relaxed_Store(Tagged< HeapObject > host, PtrType value)
static void Relaxed_Store_Map_Word(Tagged< HeapObject > host, PtrType value)
static PtrType Relaxed_Load(Tagged< HeapObject > host, int offset=0)
static Address address(Tagged< HeapObject > host, int offset=0)
static constexpr bool kIsHeapObject
static Tagged_t full_to_tagged(Address value)
static PtrType Acquire_Load_No_Unpack(PtrComprCageBase cage_base, Tagged< HeapObject > host, int offset=0)
static PtrType SeqCst_CompareAndSwap(Tagged< HeapObject > host, int offset, PtrType old, PtrType value)
static void store(Tagged< HeapObject > host, PtrType value)
static Tagged_t Release_CompareAndSwap(Tagged< HeapObject > host, PtrType old, PtrType value)
static Tagged_t * location(Tagged< HeapObject > host, int offset=0)
static PtrType Acquire_Load(Tagged< HeapObject > host, int offset=0)
static PtrType SeqCst_Load(Tagged< HeapObject > host, int offset=0)
static Address tagged_to_full(TOnHeapAddress on_heap_addr, Tagged_t tagged_value)
static PtrType SeqCst_Swap(Tagged< HeapObject > host, int offset, PtrType value)
static constexpr bool kIsSmi
static void Release_Store_Map_Word(Tagged< HeapObject > host, PtrType value)
static PtrType Relaxed_Load_Map_Word(PtrComprCageBase cage_base, Tagged< HeapObject > host)
Tagged< T > SeqCst_Load() const
Tagged< T > Relaxed_Load() const
void store(HeapObjectLayout *host, Tagged< T > value, WriteBarrierMode mode=UPDATE_WRITE_BARRIER)
Tagged< T > SeqCst_Swap(HeapObjectLayout *host, Tagged< T > value, WriteBarrierMode mode=UPDATE_WRITE_BARRIER)
void SeqCst_Store_no_write_barrier(Tagged< T > value)
void Relaxed_Store_no_write_barrier(Tagged< T > value)
Tagged< T > SeqCst_CompareAndSwap(HeapObjectLayout *host, Tagged< T > expected_value, Tagged< T > value, WriteBarrierMode mode=UPDATE_WRITE_BARRIER)
void store_no_write_barrier(Tagged< T > value)
void Release_Store_no_write_barrier(Tagged< T > value)
static Address tagged_to_full(Tagged_t tagged_value)
void SeqCst_Store(HeapObjectLayout *host, Tagged< T > value, WriteBarrierMode mode=UPDATE_WRITE_BARRIER)
void Release_Store(HeapObjectLayout *host, Tagged< T > value, WriteBarrierMode mode=UPDATE_WRITE_BARRIER)
void WriteBarrier(HeapObjectLayout *host, Tagged< T > value, WriteBarrierMode mode)
Tagged< T > Acquire_Load() const
void Relaxed_Store(HeapObjectLayout *host, Tagged< T > value, WriteBarrierMode mode=UPDATE_WRITE_BARRIER)
constexpr TaggedMember()=default
static Tagged_t full_to_tagged(Address value)
UnalignedDoubleMember()=default
uint64_t value_as_bits() const
void set_value_as_bits(uint64_t value)
UnalignedValueMember()=default
static V ReadUnalignedValue(Address p)
static void WriteUnalignedValue(Address p, V value)
static constexpr bool is_taggable_v
V8HeapCompressionSchemeImpl< MainCage > V8HeapCompressionScheme