15template <
template <
typename>
typename HandleType>
16 requires(std::is_convertible_v<HandleType<SwissNameDictionary>,
17 DirectHandle<SwissNameDictionary>>)
19 Isolate* isolate, HandleType<SwissNameDictionary> table,
26 table->SetCtrl(
i, Ctrl::kDeleted);
27 table->ClearDataTableEntry(isolate,
i);
31 int nof = table->NumberOfElements();
32 table->SetNumberOfElements(nof - 1);
33 int nod = table->NumberOfDeletedElements();
34 table->SetNumberOfDeletedElements(nod + 1);
41 return Shrink(isolate, table);
45template <
typename IsolateT,
template <
typename>
typename HandleType>
46 requires(std::is_convertible_v<HandleType<SwissNameDictionary>,
49 IsolateT* isolate, HandleType<SwissNameDictionary> table,
51 DCHECK(IsValidCapacity(new_capacity));
52 DCHECK_LE(table->NumberOfElements(), MaxUsableCapacity(new_capacity));
55 HandleType<SwissNameDictionary> new_table =
56 isolate->factory()->NewSwissNameDictionaryWithCapacity(
63 int new_enum_index = 0;
64 new_table->SetNumberOfElements(table->NumberOfElements());
65 for (
int enum_index = 0; enum_index < table->UsedCapacity(); ++enum_index) {
66 int entry = table->EntryForEnumerationIndex(enum_index);
70 if (table->ToKey(roots, entry, &
key)) {
74 int new_entry = new_table->AddInternal(
Cast<Name>(
key), value, details);
79 new_table->SetEntryForEnumerationIndex(new_enum_index, new_entry);
84 new_table->SetHash(table->Hash());
89 if (
Capacity() != other->Capacity() ||
92 Hash() != other->Hash()) {
106 if (
DetailsAt(
i) != other->DetailsAt(
i))
return false;
125 if (table->Capacity() == 0) {
129 int capacity = table->Capacity();
130 int used_capacity = table->UsedCapacity();
133 isolate->factory()->NewSwissNameDictionaryWithCapacity(
138 new_table->SetHash(table->Hash());
145 void* original_start =
147 void* new_table_start =
reinterpret_cast<void*
>(
151 MemCopy(new_table_start, original_start, bytes_to_copy);
156 for (
int i = 0;
i < capacity; ++
i) {
166 void* original_ctrl_table = table->CtrlTable();
167 void* new_ctrl_table = new_table->CtrlTable();
172 for (
int i = 0;
i < capacity; ++
i) {
173 if (
IsFull(table->GetCtrl(
i))) {
174 new_table->DetailsAtPut(
i, table->DetailsAt(
i));
181 int meta_table_used_bytes = (2 + used_capacity) * size_per_meta_table_entry;
182 MemCopy(new_table->meta_table()->begin(), table->meta_table()->begin(),
183 meta_table_used_bytes);
189template <
template <
typename>
typename HandleType>
190 requires(std::is_convertible_v<HandleType<SwissNameDictionary>,
193 Isolate* isolate, HandleType<SwissNameDictionary> table) {
201 int nof = table->NumberOfElements();
202 int capacity = table->Capacity();
203 if (nof >= (capacity >> 2))
return table;
204 int new_capacity = std::max(capacity / 2, kInitialCapacity);
205 return Rehash(isolate, table, new_capacity);
222template <
typename IsolateT>
239 for (
int enum_index = 0; enum_index <
UsedCapacity(); ++enum_index) {
242 if (!
ToKey(roots, entry, &
key))
continue;
250 int new_enum_index = 0;
252 for (Entry& e : data) {
253 int new_entry =
AddInternal(e.key, e.value, e.details);
271 if (!this->
ToKey(roots,
i, &k))
continue;
288 if (!
ToKey(roots,
i, &k))
continue;
290 if (e == value)
return k;
292 return roots.undefined_value();
301 std::numeric_limits<uint8_t>::max());
304 std::numeric_limits<uint8_t>::max());
306 std::numeric_limits<uint16_t>::max());
309 std::numeric_limits<uint16_t>::max());
union v8::internal::@341::BuiltinMetadata::KindSpecificData data
static V8_INLINE bool InYoungGeneration(Tagged< Object > object)
constexpr int as_int() const
static bool FilterKey(Tagged< Object > obj, PropertyFilter filter)
PropertyAttributes attributes() const
static constexpr PropertyDetails Empty(PropertyCellType cell_type=PropertyCellType::kNoCell)
static constexpr int MaxUsableCapacity(int capacity)
Tagged< Object > KeyAt(InternalIndex entry)
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 HandleType< SwissNameDictionary > Rehash(IsolateT *isolate, HandleType< SwissNameDictionary > table, int new_capacity)
int EntryForEnumerationIndex(int enumeration_index)
static constexpr int kDataTableValueEntryIndex
Tagged< Object > ValueAtRaw(int entry)
Tagged< Object > ValueAt(InternalIndex entry)
static constexpr Offset DataTableEndOffset(int capacity)
static constexpr int MetaTableSizePerEntryFor(int capacity)
static constexpr Offset CtrlTableStartOffset(int capacity)
void SetEntryForEnumerationIndex(int enumeration_index, int entry)
static constexpr int kDataTableKeyEntryIndex
int NumberOfDeletedElements()
static constexpr int kInitialCapacity
static HandleType< SwissNameDictionary > Shrink(Isolate *isolate, HandleType< SwissNameDictionary > table)
bool EqualsForTesting(Tagged< SwissNameDictionary > other)
Tagged< Object > SlowReverseLookup(Isolate *isolate, Tagged< Object > value)
bool ToKey(ReadOnlyRoots roots, InternalIndex entry, Tagged< Object > *out_key)
static DirectHandle< SwissNameDictionary > ShallowCopy(Isolate *isolate, DirectHandle< SwissNameDictionary > table)
PropertyDetails DetailsAt(InternalIndex entry)
int NumberOfEnumerableProperties()
static constexpr int kMax2ByteMetaTableCapacity
static bool IsFull(ctrl_t c)
static constexpr Offset DataTableStartOffset()
int AddInternal(Tagged< Name > key, Tagged< Object > value, PropertyDetails details)
static const int kGroupWidth
ctrl_t GetCtrl(int entry)
static HandleType< SwissNameDictionary > DeleteEntry(Isolate *isolate, HandleType< SwissNameDictionary > table, InternalIndex entry)
ZoneVector< RpoNumber > & result
ReadOnlyRoots GetReadOnlyRoots()
Tagged(T object) -> Tagged< T >
void MemCopy(void *dest, const void *src, size_t size)
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
#define DCHECK_LE(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define V8_EXPORT_PRIVATE
std::unique_ptr< ValueMirror > value
std::unique_ptr< ValueMirror > key