5#ifndef V8_OBJECTS_SWISS_NAME_DICTIONARY_INL_H_
6#define V8_OBJECTS_SWISS_NAME_DICTIONARY_INL_H_
30#include "torque-generated/src/objects/swiss-name-dictionary-tq-inl.inc"
35 return reinterpret_cast<ctrl_t*
>(
36 field_address(CtrlTableStartOffset(Capacity())));
40 return reinterpret_cast<uint8_t*
>(
78 ((capacity & (capacity - 1)) == 0));
111 return capacity - capacity / 8;
118 if (at_least_space_for <= 4) {
119 if (at_least_space_for == 0) {
121 }
else if (at_least_space_for < 4) {
132 int non_normalized = at_least_space_for + at_least_space_for / 7;
152template <
typename IsolateT>
157 uint32_t hash = name->hash();
183 Group g{ctrl + seq.offset()};
185 int candidate_entry = seq.offset(
i);
218template <
typename IsolateT>
266 DCHECK(!IsTheHole(value));
282 uint8_t encoded_details = details.
ToByte();
323 if (
static_cast<unsigned>(entry.
as_int()) >=
324 static_cast<unsigned>(
Capacity())) {
343template <
typename IsolateT,
template <
typename>
typename HandleType>
344 requires(std::is_convertible_v<HandleType<SwissNameDictionary>,
347 IsolateT* isolate, HandleType<SwissNameDictionary> table) {
348 int capacity = table->Capacity();
350 if (table->UsedCapacity() < MaxUsableCapacity(capacity)) {
355 int new_capacity = capacity == 0 ? kInitialCapacity : capacity * 2;
356 return Rehash(isolate, table, new_capacity);
367 DCHECK_LT(
static_cast<unsigned>(entry),
static_cast<unsigned>(capacity));
385 int mask = capacity - 1;
389 copy_entry == capacity + entry);
391 ctrl[copy_entry] = h;
401 auto mask = g.MatchEmpty();
406 return seq.offset(
mask.LowestBitSet());
446 int field_index,
int value) {
447 static_assert((std::is_same<T, uint8_t>::value) ||
448 (std::is_same<T, uint16_t>::value) ||
449 (std::is_same<T, uint32_t>::value));
450 DCHECK_LE(value, std::numeric_limits<T>::max());
451 DCHECK_LT(meta_table->begin() + field_index *
sizeof(T), meta_table->end());
452 T* raw_data =
reinterpret_cast<T*
>(meta_table->begin());
453 raw_data[field_index] =
value;
460 static_assert((std::is_same<T, uint8_t>::value) ||
461 (std::is_same<T, uint16_t>::value) ||
462 (std::is_same<T, uint32_t>::value));
463 DCHECK_LT(meta_table->begin() + field_index *
sizeof(T), meta_table->end());
464 T* raw_data =
reinterpret_cast<T*
>(meta_table->begin());
465 return raw_data[field_index];
475 return sizeof(uint8_t);
477 return sizeof(uint16_t);
479 return sizeof(uint32_t);
497 return key_candidate != roots.the_hole_value();
503 if (!
IsKey(roots, k))
return false;
514template <
typename IsolateT,
template <
typename>
typename HandleType>
515 requires(std::is_convertible_v<HandleType<SwissNameDictionary>,
518 IsolateT* isolate, HandleType<SwissNameDictionary> original_table,
521 DCHECK(original_table->FindEntry(isolate, *
key).is_not_found());
523 HandleType<SwissNameDictionary> table =
524 EnsureGrowable(isolate, original_table);
527 int nof = raw_table->NumberOfElements();
528 int nod = raw_table->NumberOfDeletedElements();
529 int new_enum_index = nof + nod;
531 int new_entry = raw_table->AddInternal(*
key, *value, details);
533 raw_table->SetNumberOfElements(nof + 1);
534 raw_table->SetEntryForEnumerationIndex(new_enum_index, new_entry);
550 uint32_t hash =
key->hash();
568template <
typename IsolateT>
584 set_meta_table(meta_table);
594 : enum_index_{
start}, dict_{dict} {
620 return !(*
this == b);
628 return InternalIndex(dict_->EntryForEnumerationIndex(enum_index_));
640 if (dict_.is_null()) {
714 constexpr int kConstSize =
717 2 *
sizeof(uint32_t);
718 constexpr int kPerEntrySize =
740 static_assert(Ctrl::kEmpty < 0);
741 static_assert(Ctrl::kDeleted < 0);
742 static_assert(Ctrl::kSentinel < 0);
751 static_assert(Ctrl::kDeleted < Ctrl::kSentinel);
752 static_assert(Ctrl::kEmpty < Ctrl::kSentinel);
753 static_assert(Ctrl::kSentinel < 0);
754 return c < Ctrl::kSentinel;
762 int non_zero_capacity = capacity | (capacity == 0);
#define SLOW_DCHECK(condition)
V8_INLINE bool is_null() const
static constexpr int kHeaderSize
Address field_address(size_t offset) const
ObjectSlot RawField(int byte_offset) const
T ReadField(size_t offset) const
void WriteField(size_t offset, T value) const
static InternalIndex NotFound()
constexpr int as_int() const
detail::ArrayHeaderBase< HeapObjectLayout, true > Header
static const int kNoHashSentinel
static PropertyDetails FromByte(uint8_t encoded_details)
static constexpr int kMaxValue
IndexIterable(DirectHandle< SwissNameDictionary > dict)
IndexIterator(DirectHandle< SwissNameDictionary > dict, int start)
bool operator==(const IndexIterator &b) const
bool operator!=(const IndexIterator &b) const
InternalIndex operator*()
IndexIterator & operator++()
DirectHandle< SwissNameDictionary > dict_
static constexpr int MaxUsableCapacity(int capacity)
Tagged< Object > KeyAt(InternalIndex entry)
InternalIndex FindEntry(IsolateT *isolate, Tagged< Object > key)
static constexpr int DataTableSize(int capacity)
static constexpr int kMax1ByteMetaTableCapacity
IndexIterable IterateEntries()
void SetNumberOfElements(int elements)
static constexpr int CtrlTableSize(int capacity)
void Initialize(IsolateT *isolate, Tagged< ByteArray > meta_table, int capacity)
static swiss_table::ProbeSequence< Group::kWidth > probe(uint32_t hash, int capacity)
static constexpr bool IsValidCapacity(int capacity)
Tagged< Name > NameAt(InternalIndex entry)
int EntryForEnumerationIndex(int enumeration_index)
void ValueAtPut(InternalIndex entry, Tagged< Object > value)
static constexpr int kMetaTableDeletedElementCountFieldIndex
static constexpr int kDataTableValueEntryIndex
void ClearDataTableEntry(Isolate *isolate, int entry)
static constexpr Offset PrefixOffset()
Tagged< Object > ValueAtRaw(int entry)
Tagged< Object > ValueAt(InternalIndex entry)
void SetCapacity(int capacity)
static constexpr Offset DataTableEndOffset(int capacity)
static constexpr Offset MetaTablePointerOffset()
IndexIterable IterateEntriesOrdered()
static bool IsEmpty(ctrl_t c)
static constexpr int MetaTableSizePerEntryFor(int capacity)
void DetailsAtPut(InternalIndex entry, PropertyDetails value)
static constexpr int kDataTableEntryCount
static constexpr int kMetaTableEnumerationDataStartIndex
static constexpr Offset CtrlTableStartOffset(int capacity)
Tagged< Object > LoadFromDataTable(int entry, int data_offset)
uint8_t * PropertyDetailsTable()
static bool IsDeleted(ctrl_t c)
void SetEntryForEnumerationIndex(int enumeration_index, int entry)
static constexpr int kDataTableKeyEntryIndex
static bool IsEmptyOrDeleted(ctrl_t c)
std::optional< Tagged< Object > > TryValueAt(InternalIndex entry)
static constexpr int MaxCapacity()
int NumberOfDeletedElements()
static constexpr int kInitialCapacity
void SetNumberOfDeletedElements(int deleted_elements)
void StoreToDataTable(int entry, int data_offset, Tagged< Object > data)
static constexpr int kMetaTableElementCountFieldIndex
static HandleType< SwissNameDictionary > EnsureGrowable(IsolateT *isolate, HandleType< SwissNameDictionary > table)
static int CapacityFor(int at_least_space_for)
void StoreToDataTableNoBarrier(int entry, int data_offset, Tagged< Object > data)
static constexpr Offset CapacityOffset()
void SetCtrl(int entry, ctrl_t h)
static constexpr Offset PropertyDetailsTableStartOffset(int capacity)
bool ToKey(ReadOnlyRoots roots, InternalIndex entry, Tagged< Object > *out_key)
static bool IsKey(ReadOnlyRoots roots, Tagged< Object > key_candidate)
static constexpr int SizeFor(int capacity)
static HandleType< SwissNameDictionary > Add(IsolateT *isolate, HandleType< SwissNameDictionary > table, DirectHandle< Name > key, DirectHandle< Object > value, PropertyDetails details, InternalIndex *entry_out=nullptr)
void SetKey(int entry, Tagged< Object > key)
PropertyDetails DetailsAt(InternalIndex entry)
int FindFirstEmpty(uint32_t hash)
static constexpr int kMax2ByteMetaTableCapacity
void SetMetaTableField(int field_index, int value)
static bool IsFull(ctrl_t c)
static constexpr Offset DataTableStartOffset()
int AddInternal(Tagged< Name > key, Tagged< Object > value, PropertyDetails details)
int GetMetaTableField(int field_index)
static const int kGroupWidth
swiss_table::ctrl_t ctrl_t
static constexpr int MetaTableSizeFor(int capacity)
ctrl_t GetCtrl(int entry)
static PtrType Relaxed_Load(Tagged< HeapObject > host, int offset=0)
ZoneVector< RpoNumber > & result
V8_BASE_EXPORT constexpr uint32_t RoundUpToPowerOfTwo32(uint32_t value)
static uint32_t H1(uint32_t hash)
static swiss_table::ctrl_t H2(uint32_t hash)
constexpr int kTaggedSize
constexpr int kOneByteSize
V8_INLINE bool GetIsolateFromHeapObject(Tagged< HeapObject > object, Isolate **isolate)
void MemsetTagged(Tagged_t *start, Tagged< MaybeObject > value, size_t counter)
V8_INLINE DirectHandle< T > direct_handle(Tagged< T > object, Isolate *isolate)
V8_INLINE PtrComprCageBase GetPtrComprCageBase()
bool IsUniqueName(Tagged< Name > obj)
static constexpr int kMaxFixedArrayCapacity
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
#define OBJECT_CONSTRUCTORS_IMPL(Type, Super)
#define ACCESSORS_CHECKED2(holder, name, type, offset, get_condition, set_condition)
#define WRITE_BARRIER(object, offset, value)
#define RELAXED_WRITE_FIELD(p, offset, value)
#define DCHECK_LE(v1, v2)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK_NE(v1, v2)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
static constexpr size_t kWidth