5#ifndef V8_OBJECTS_STRING_FORWARDING_TABLE_INL_H_
6#define V8_OBJECTS_STRING_FORWARDING_TABLE_INL_H_
36 bool* is_one_byte)
const;
68 bool is_one_byte, uint32_t
raw_hash);
91 ~kExternalResourceEncodingMask;
138 raw_hash =
static_cast<uint32_t
>(hash_or_string.
ptr());
146 Address address = ExternalResourceAddress();
147 *is_one_byte = (address & kExternalResourceEncodingMask) ==
148 kExternalResourceIsOneByteTag;
149 address &= kExternalResourceAddressMask;
167 address |= kExternalResourceIsOneByteTag;
169 set_external_resource(address);
174 set_original_string(
string);
175 set_forward_string(forward_to);
181 bool is_one_byte, uint32_t raw_hash) {
182 set_original_string(
string);
183 set_raw_hash_if_empty(raw_hash);
184 set_external_resource(resource, is_one_byte);
192 address |= kExternalResourceIsOneByteTag;
208 auto resource = external_resource(&is_one_byte);
217 if (IsThinString(stored_original)) {
222 if (!IsExternalString(original))
return;
226 auto resource = external_resource(&is_one_byte);
227 if (resource !=
nullptr &&
228 reinterpret_cast<Address>(resource) != original_resource) {
235 static std::unique_ptr<Block> New(
int capacity);
236 explicit Block(
int capacity);
238 void*
operator new(
size_t size,
int capacity);
239 void*
operator new(
size_t size) =
delete;
240 void operator delete(
void*
data);
253 void UpdateAfterYoungEvacuation(
PtrComprCageBase cage_base,
int up_to_index);
255 void UpdateAfterFullEvacuation(
PtrComprCageBase cage_base,
int up_to_index);
273 return base::AsAtomicPointer::Acquire_Load(&begin_[index]);
278 return begin_[
index];
283 base::AsAtomicPointer::Release_Store(&begin_[
size_], block.release());
287 static std::unique_ptr<BlockVector> Grow(
BlockVector* data,
size_t capacity,
304 uint32_t* index_in_block) {
309 const uint32_t block_index =
332template <
typename Func>
336 const uint32_t last_block_index =
static_cast<uint32_t
>(blocks->
size() - 1);
337 for (uint32_t block_index = 0; block_index < last_block_index;
340 for (
int index = 0; index < block->capacity(); ++
index) {
341 Record* rec = block->record(index);
348 for (uint32_t index = 0; index < max_index; ++
index) {
349 Record* rec = block->record(index);
union v8::internal::@341::BuiltinMetadata::KindSpecificData data
static void Release_Store(T *addr, typename std::remove_reference< T >::type new_value)
static T AcquireRelease_CompareAndSwap(T *addr, typename std::remove_reference< T >::type old_value, typename std::remove_reference< T >::type new_value)
static T Acquire_Load(T *addr)
static T Release_CompareAndSwap(T *addr, typename std::remove_reference< T >::type old_value, typename std::remove_reference< T >::type new_value)
Tagged< Object > Acquire_Load() const
void Release_Store(Tagged< Object > value) const
static constexpr int kHashNotComputedMask
static bool IsHashFieldComputed(uint32_t raw_hash_field)
void AddBlock(std::unique_ptr< Block > block)
V8_NO_UNIQUE_ADDRESS Allocator allocator_
std::atomic< size_t > size_
Block * LoadBlock(size_t index, AcquireLoadTag)
std::allocator< Block * > Allocator
Block * LoadBlock(size_t index)
const Record * record(int index) const
Record * record(int index)
OffHeapObjectSlot OriginalStringSlot() const
void SetInternalized(Tagged< String > string, Tagged< String > forward_to)
bool TryUpdateExternalResource(v8::String::ExternalStringResourceBase *resource, bool is_one_byte)
uint32_t raw_hash(PtrComprCageBase cage_base) const
Tagged_t forward_string_or_hash_
void set_external_resource(v8::String::ExternalStringResourceBase *resource, bool is_one_byte)
void DisposeExternalResource()
Tagged< String > forward_string(PtrComprCageBase cage_base) const
Address ExternalResourceAddress() const
Address external_resource_
void SetExternal(Tagged< String > string, v8::String::ExternalStringResourceBase *, bool is_one_byte, uint32_t raw_hash)
Tagged< Object > ForwardStringObjectOrHash(PtrComprCageBase cage_base) const
static constexpr intptr_t kExternalResourceEncodingMask
void set_external_resource(Address address)
Tagged< Object > OriginalStringObject(PtrComprCageBase cage_base) const
v8::String::ExternalStringResourceBase * external_resource(bool *is_one_byte) const
static constexpr intptr_t kExternalResourceIsOneByteTag
OffHeapObjectSlot ForwardStringOrHashSlot() const
void set_original_string(Tagged< Object > object)
void set_forward_string(Tagged< Object > object)
void DisposeUnusedExternalResource(Isolate *isolate, Tagged< String > original_string)
Tagged_t original_string_
Tagged< String > original_string(PtrComprCageBase cage_base) const
static constexpr intptr_t kExternalResourceAddressMask
void set_raw_hash_if_empty(uint32_t raw_hash)
std::atomic< BlockVector * > blocks_
static uint32_t IndexInBlock(int index, uint32_t block)
bool TryUpdateExternalResource(int index, T *resource)
static constexpr int kInitialBlockSizeHighestBit
static constexpr Tagged< Smi > unused_element()
std::atomic< int > next_free_index_
static uint32_t CapacityForBlock(uint32_t block)
static constexpr int kInitialBlockSize
static uint32_t BlockForIndex(int index, uint32_t *index_in_block_out)
V8_INLINE void IterateElements(Func &&callback)
V8_INLINE constexpr StorageType ptr() const
Handle< FixedArray > elements_
constexpr unsigned CountLeadingZeros(T value)
const intptr_t kHeapObjectTagMask
constexpr ExternalPointer_t kNullExternalPointer
constexpr int kBitsPerInt
V8_INLINE constexpr bool IsHeapObject(TaggedImpl< kRefType, StorageType > obj)
SlotTraits::TOffHeapObjectSlot OffHeapObjectSlot
static constexpr Address kNullAddress
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
#define DCHECK_NOT_NULL(val)
#define DCHECK_NE(v1, v2)
#define DCHECK_GE(v1, v2)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
#define V8_NO_UNIQUE_ADDRESS