5#ifndef V8_OBJECTS_DESCRIPTOR_ARRAY_INL_H_
6#define V8_OBJECTS_DESCRIPTOR_ARRAY_INL_H_
33#include "torque-generated/src/objects/descriptor-array-tq-inl.inc"
39 kNumberOfAllDescriptorsOffset)
41 kNumberOfDescriptorsOffset)
53 set_enum_cache(array->enum_cache());
57 bool concurrent_search) {
61 if (valid_descriptors == 0) {
67 const int kMaxElementsForLinearSearch = 8;
68 if (valid_descriptors <= kMaxElementsForLinearSearch || concurrent_search) {
76 int valid_descriptors) {
80 uint32_t hash = name->hash();
84 int number = *std::ranges::lower_bound(std::views::iota(0,
end), hash,
85 std::less<>(), [&](
int i) {
92 for (; number <
end; ++number) {
98 if (index.as_int() >= valid_descriptors) {
103 if (entry->hash() != hash) {
112 int valid_descriptors) {
114 for (
int i = 0;
i < valid_descriptors; ++
i) {
122 bool concurrent_search) {
124 int number_of_own_descriptors = map->NumberOfOwnDescriptors();
126 return Search(name, number_of_own_descriptors, concurrent_search);
130 for (
int desc_index = field_index; desc_index < valid_descriptors;
143 int number_of_own_descriptors = map->NumberOfOwnDescriptors();
145 return Search(field_index, number_of_own_descriptors);
152 int number_of_own_descriptors = map->NumberOfOwnDescriptors();
156 int number = cache->
Lookup(map, name);
161 cache->Update(map, name, number);
168 static_assert(kEndOfStrongFieldsOffset == kStartOfWeakFieldsOffset,
169 "Weak and strong fields are continuous.");
170 static_assert(kEndOfWeakFieldsOffset == kHeaderSize,
171 "Weak fields extend up to the end of the header.");
172 return RawField(DescriptorArray::kStartOfStrongFieldsOffset);
178 DCHECK_LE(descriptor, number_of_all_descriptors());
189 bool is_initialized = !IsUndefined(maybe_name);
192 return is_initialized;
197 return GetKey(cage_base, descriptor_number);
226 int descriptor_number) {
256 return GetValue(cage_base, descriptor_number);
309 Set(descriptor_number,
key, value, desc->GetDetails());
315 DCHECK_LE(descriptor_number + 1, number_of_all_descriptors());
316 set_number_of_descriptors(descriptor_number + 1);
319 uint32_t desc_hash = desc->GetKey()->hash();
321 uint32_t collision_hash = 0;
325 for (insertion = descriptor_number; insertion > 0; --insertion) {
327 collision_hash =
key->hash();
328 if (collision_hash <= desc_hash)
break;
334 if (
V8_LIKELY(collision_hash != desc_hash))
return;
349 const auto current_epoch = gc_epoch & Epoch::kMask;
352 const auto epoch_from_state = Epoch::decode(raw_gc_state);
354 if (current_epoch != epoch_from_state) {
359 Epoch::decode(epoch_from_state + 1) == current_epoch);
360 new_raw_gc_state =
NewState(current_epoch, 0, index_to_mark);
364 if ((already_marked + delta) >= index_to_mark) {
367 new_raw_gc_state =
NewState(current_epoch, already_marked,
368 index_to_mark - already_marked);
370 if (
SwapState(array, raw_gc_state, new_raw_gc_state)) {
381 const auto current_epoch = gc_epoch & Epoch::kMask;
392 if (current_epoch != Epoch::decode(raw_gc_state) || (marked + delta) == 0) {
399 array->number_of_descriptors() ? array->number_of_descriptors()
400 : array->number_of_all_descriptors();
412 return {marked, marked};
416 NewState(current_epoch, marked + delta, 0))) {
417 return {marked, marked + delta};
#define SLOW_DCHECK_IMPLIES(v1, v2)
static std::pair< DescriptorIndex, DescriptorIndex > AcquireDescriptorRangeToMark(unsigned gc_epoch, Tagged< DescriptorArray > array)
static constexpr RawGCStateType NewState(unsigned masked_epoch, DescriptorIndex marked, DescriptorIndex delta)
static bool SwapState(Tagged< DescriptorArray > array, RawGCStateType old_state, RawGCStateType new_state)
static bool TryUpdateIndicesToMark(unsigned gc_epoch, Tagged< DescriptorArray > array, DescriptorIndex index_to_mark)
PropertyDetails GetDetails(InternalIndex descriptor_number)
bool IsInitializedDescriptor(InternalIndex descriptor_number) const
Tagged< FieldType > GetFieldType(InternalIndex descriptor_number)
int GetFieldIndex(InternalIndex descriptor_number)
V8_INLINE InternalIndex SearchWithCache(Isolate *isolate, Tagged< Name > name, Tagged< Map > map)
void Set(InternalIndex descriptor_number, Descriptor *desc)
int GetSortedKeyIndex(int descriptor_number)
ObjectSlot GetFirstPointerSlot()
ObjectSlot GetDescriptorSlot(int descriptor)
V8_INLINE InternalIndex Search(Tagged< Name > name, int number_of_own_descriptors, bool concurrent_search=false)
Tagged< Name > GetKey(InternalIndex descriptor_number) const
static const int kNotFound
void SetSortedKey(int pointer, int descriptor_number)
int number_of_entries() const
static const int kEntryKeyOffset
Tagged< MaybeObject > GetValue(InternalIndex descriptor_number)
void SwapSortedKeys(int first, int second)
void SetDetails(InternalIndex descriptor_number, PropertyDetails details)
V8_INLINE InternalIndex BinarySearch(Tagged< Name > name, int number_of_own_descriptors)
static const int kEntryValueOffset
Tagged< Name > GetSortedKey(int descriptor_number)
void Append(Descriptor *desc)
V8_EXPORT_PRIVATE void CheckNameCollisionDuringInsertion(Descriptor *desc, uint32_t descriptor_hash, int insertion_index)
void SetKey(InternalIndex descriptor_number, Tagged< Name > key)
static constexpr int OffsetOfDescriptorAt(int descriptor)
void SetValue(InternalIndex descriptor_number, Tagged< MaybeObject > value)
V8_INLINE InternalIndex LinearSearch(Tagged< Name > name, int number_of_own_descriptors)
void CopyEnumCacheFrom(Tagged< DescriptorArray > array)
Tagged< Object > GetStrongValue(InternalIndex descriptor_number)
int Lookup(Tagged< Map > source, Tagged< Name > name)
static InternalIndex NotFound()
constexpr int as_int() const
static V8_EXPORT_PRIVATE Tagged< FieldType > UnwrapFieldType(Tagged< MaybeObject > wrapped_type)
PropertyLocation location() const
Tagged< Smi > AsSmi() const
PropertyDetails set_pointer(int i) const
static void Relaxed_Store(Tagged< HeapObject > host, PtrType value)
static PtrType Relaxed_Load(Tagged< HeapObject > host, int offset=0)
ZoneVector< RpoNumber > & result
V8_INLINE constexpr bool IsSmi(TaggedImpl< kRefType, StorageType > obj)
V8_INLINE PtrComprCageBase GetPtrComprCageBase()
bool IsUniqueName(Tagged< Name > obj)
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
static constexpr RelaxedLoadTag kRelaxedLoad
#define RELAXED_INT16_ACCESSORS(holder, name, offset)
#define TQ_OBJECT_CONSTRUCTORS_IMPL(Type)
#define WRITE_BARRIER(object, offset, value)
#define RELAXED_UINT32_ACCESSORS(holder, name, offset)
#define DCHECK_LE(v1, v2)
#define CHECK_LT(lhs, rhs)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
#define DCHECK_GT(v1, v2)
#define V8_LIKELY(condition)