| // Copyright 2019 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef V8_OBJECTS_COMPRESSED_SLOTS_H_ |
| #define V8_OBJECTS_COMPRESSED_SLOTS_H_ |
| |
| #ifdef V8_COMPRESS_POINTERS |
| |
| #include "src/objects/slots.h" |
| |
| namespace v8 { |
| namespace internal { |
| |
| // A CompressedObjectSlot instance describes a kTaggedSize-sized field ("slot") |
| // holding a compressed tagged pointer (smi or heap object). |
| // Its address() is the address of the slot. |
| // The slot's contents can be read and written using operator* and store(). |
| class CompressedObjectSlot : public SlotBase<CompressedObjectSlot, Tagged_t> { |
| public: |
| using TObject = Object; |
| using THeapObjectSlot = CompressedHeapObjectSlot; |
| |
| static constexpr bool kCanBeWeak = false; |
| |
| CompressedObjectSlot() : SlotBase(kNullAddress) {} |
| explicit CompressedObjectSlot(Address ptr) : SlotBase(ptr) {} |
| explicit CompressedObjectSlot(Address* ptr) |
| : SlotBase(reinterpret_cast<Address>(ptr)) {} |
| inline explicit CompressedObjectSlot(Object* object); |
| explicit CompressedObjectSlot(Object const* const* ptr) |
| : SlotBase(reinterpret_cast<Address>(ptr)) {} |
| template <typename T> |
| explicit CompressedObjectSlot(SlotBase<T, TData, kSlotDataAlignment> slot) |
| : SlotBase(slot.address()) {} |
| |
| // Compares memory representation of a value stored in the slot with given |
| // raw value without decompression. |
| inline bool contains_value(Address raw_value) const; |
| |
| // TODO(leszeks): Consider deprecating the operator* load, and always pass the |
| // Isolate. |
| inline Object operator*() const; |
| inline Object load(IsolateRoot isolate) const; |
| inline void store(Object value) const; |
| |
| inline Object Acquire_Load() const; |
| inline Object Relaxed_Load() const; |
| inline Object Relaxed_Load(IsolateRoot isolate) const; |
| inline void Relaxed_Store(Object value) const; |
| inline void Release_Store(Object value) const; |
| inline Object Release_CompareAndSwap(Object old, Object target) const; |
| }; |
| |
| // A CompressedMaybeObjectSlot instance describes a kTaggedSize-sized field |
| // ("slot") holding a possibly-weak compressed tagged pointer |
| // (think: MaybeObject). |
| // Its address() is the address of the slot. |
| // The slot's contents can be read and written using operator* and store(). |
| class CompressedMaybeObjectSlot |
| : public SlotBase<CompressedMaybeObjectSlot, Tagged_t> { |
| public: |
| using TObject = MaybeObject; |
| using THeapObjectSlot = CompressedHeapObjectSlot; |
| |
| static constexpr bool kCanBeWeak = true; |
| |
| CompressedMaybeObjectSlot() : SlotBase(kNullAddress) {} |
| explicit CompressedMaybeObjectSlot(Address ptr) : SlotBase(ptr) {} |
| explicit CompressedMaybeObjectSlot(Object* ptr) |
| : SlotBase(reinterpret_cast<Address>(ptr)) {} |
| explicit CompressedMaybeObjectSlot(MaybeObject* ptr) |
| : SlotBase(reinterpret_cast<Address>(ptr)) {} |
| template <typename T> |
| explicit CompressedMaybeObjectSlot( |
| SlotBase<T, TData, kSlotDataAlignment> slot) |
| : SlotBase(slot.address()) {} |
| |
| inline MaybeObject operator*() const; |
| inline MaybeObject load(IsolateRoot isolate) const; |
| inline void store(MaybeObject value) const; |
| |
| inline MaybeObject Relaxed_Load() const; |
| inline MaybeObject Relaxed_Load(IsolateRoot isolate) const; |
| inline void Relaxed_Store(MaybeObject value) const; |
| inline void Release_CompareAndSwap(MaybeObject old, MaybeObject target) const; |
| }; |
| |
| // A CompressedHeapObjectSlot instance describes a kTaggedSize-sized field |
| // ("slot") holding a weak or strong compressed pointer to a heap object (think: |
| // HeapObjectReference). |
| // Its address() is the address of the slot. |
| // The slot's contents can be read and written using operator* and store(). |
| // In case it is known that that slot contains a strong heap object pointer, |
| // ToHeapObject() can be used to retrieve that heap object. |
| class CompressedHeapObjectSlot |
| : public SlotBase<CompressedHeapObjectSlot, Tagged_t> { |
| public: |
| CompressedHeapObjectSlot() : SlotBase(kNullAddress) {} |
| explicit CompressedHeapObjectSlot(Address ptr) : SlotBase(ptr) {} |
| explicit CompressedHeapObjectSlot(Object* ptr) |
| : SlotBase(reinterpret_cast<Address>(ptr)) {} |
| template <typename T> |
| explicit CompressedHeapObjectSlot(SlotBase<T, TData, kSlotDataAlignment> slot) |
| : SlotBase(slot.address()) {} |
| |
| inline HeapObjectReference operator*() const; |
| inline HeapObjectReference load(IsolateRoot isolate) const; |
| inline void store(HeapObjectReference value) const; |
| |
| inline HeapObject ToHeapObject() const; |
| |
| inline void StoreHeapObject(HeapObject value) const; |
| }; |
| |
| // An OffHeapCompressedObjectSlot instance describes a kTaggedSize-sized field |
| // ("slot") holding a compressed tagged pointer (smi or heap object). |
| // Unlike CompressedObjectSlot, it does not assume that the slot is on the heap, |
| // and so does not provide an operator* with implicit Isolate* calculation. |
| // Its address() is the address of the slot. |
| // The slot's contents can be read and written using load() and store(). |
| class OffHeapCompressedObjectSlot |
| : public SlotBase<OffHeapCompressedObjectSlot, Tagged_t> { |
| public: |
| using TObject = Object; |
| using THeapObjectSlot = OffHeapCompressedObjectSlot; |
| |
| static constexpr bool kCanBeWeak = false; |
| |
| OffHeapCompressedObjectSlot() : SlotBase(kNullAddress) {} |
| explicit OffHeapCompressedObjectSlot(const uint32_t* ptr) |
| : SlotBase(reinterpret_cast<Address>(ptr)) {} |
| |
| inline Object load(IsolateRoot isolate) const; |
| inline void store(Object value) const; |
| |
| inline Object Relaxed_Load(IsolateRoot isolate) const; |
| inline Object Acquire_Load(IsolateRoot isolate) const; |
| inline void Relaxed_Store(Object value) const; |
| inline void Release_Store(Object value) const; |
| inline void Release_CompareAndSwap(Object old, Object target) const; |
| }; |
| |
| } // namespace internal |
| } // namespace v8 |
| |
| #endif // V8_COMPRESS_POINTERS |
| |
| #endif // V8_OBJECTS_COMPRESSED_SLOTS_H_ |