5#ifndef V8_OBJECTS_TRANSITIONS_INL_H_
6#define V8_OBJECTS_TRANSITIONS_INL_H_
70 auto res =
transitions()->GetSideStepTransitions()->get(
78 if (res.GetHeapObjectIfWeak(&target))
return target;
106 DCHECK(IsWeakFixedArray(transitions));
117 DCHECK(IsWeakFixedArray(transitions));
123 if (proto_transitions->length() == 0)
return 0;
126 return raw.
ToSmi().value();
132 get(
ToKeyIndex(transition_number)).GetHeapObjectAssumeStrong());
170 DCHECK(descriptors->GetKey(descriptor)->Equals(name));
171 return descriptors->GetDetails(descriptor);
176 return transition->GetLastDescriptorDetails(
isolate_);
183 return transition->instance_descriptors()->GetKey(descriptor);
211 return transitions()->GetTarget(transition_number);
219 DCHECK(value.IsWeakOrCleared());
220 DCHECK(value.IsCleared() || IsMap(value.GetHeapObjectAssumeWeak()));
221 DCHECK(!value.IsCleared());
233 DCHECK(isolate->has_active_deserializer());
238 IsUndefined(heap_object, isolate)) {
246 int* out_insertion_index) {
256 bool concurrent_search,
257 int* out_insertion_index) {
258 return SearchName(symbol, concurrent_search, out_insertion_index);
262 int* out_insertion_index) {
267 if (out_insertion_index !=
nullptr) {
268 *out_insertion_index = 0;
275 const int kMaxElementsForLinearSearch = 8;
285 int* out_insertion_index) {
287 uint32_t hash = name->hash();
291 int i = *std::ranges::lower_bound(std::views::iota(0,
end), hash,
292 std::less<>(), [&](
int i) {
294 return entry->hash();
299 for (;
i <
end; ++
i) {
304 uint32_t entry_hash = entry->hash();
305 if (entry_hash != hash) {
306 if (out_insertion_index !=
nullptr) {
307 *out_insertion_index =
i + (entry_hash > hash ? 0 : 1);
313 if (out_insertion_index !=
nullptr) {
314 *out_insertion_index =
end;
320 int* out_insertion_index) {
322 if (out_insertion_index !=
nullptr) {
323 uint32_t hash = name->hash();
324 for (
int i = 0;
i < len;
i++) {
326 if (entry == name)
return i;
327 if (entry->hash() > hash) {
328 *out_insertion_index =
i;
332 *out_insertion_index = len;
335 for (
int i = 0;
i < len;
i++) {
343 bool concurrent_access)
347 encoding_(GetEncoding(
isolate_, raw_transitions_)),
348 concurrent_access_(concurrent_access) {
362 }
else if (
raw_transitions.GetHeapObjectIfStrong(isolate, &heap_object)) {
363 if (IsTransitionArray(heap_object)) {
365 }
else if (IsPrototypeInfo(heap_object)) {
368 DCHECK(IsMap(heap_object));
397 .SearchTransition(name,
kind, attributes);
407 if (
result.is_null())
return {};
423 if (cmp != 0)
return cmp;
432 return hash1 <= hash2 ? -1 : 1;
442 if (kind1 != kind2) {
443 return static_cast<int>(kind1) <
static_cast<int>(kind2) ? -1 : 1;
446 if (attributes1 != attributes2) {
447 return static_cast<int>(attributes1) <
static_cast<int>(attributes2) ? -1
471template <
typename Char>
475 if (transition_target->NumberOfOwnDescriptors() == 0)
return false;
480 if (!IsString(transition_name))
return false;
481 if (!
Cast<String>(transition_name)->IsEqualTo(key_chars))
return false;
485template <
typename Char>
506 int entries = array->number_of_transitions();
508 const int kMaxEntriesForLinearSearch = 8;
509 if (
entries > kMaxEntriesForLinearSearch)
525template <
typename Callback,
typename ProtoCallback,
typename SideStepCallback,
529 ProtoCallback proto_transition_callback,
530 SideStepCallback side_step_transition_callback) {
539 if constexpr (with_key) {
550 int num_transitions = transition_array->number_of_transitions();
552 for (
int i = 0;
i < num_transitions; ++
i) {
553 if constexpr (with_key) {
560 if constexpr (!std::is_same<ProtoCallback, std::nullptr_t>::value) {
569 if (target.GetHeapObjectIfWeak(&heap_object)) {
570 proto_transition_callback(
Cast<Map>(heap_object));
575 if constexpr (!std::is_same<SideStepCallback, std::nullptr_t>::value) {
583 if constexpr (with_key) {
584 side_step_transition_callback(
586 target.GetHeapObjectOrSmi());
588 side_step_transition_callback(target.GetHeapObjectOrSmi());
#define SLOW_DCHECK_IMPLIES(v1, v2)
base::Mutex * full_transition_array_access()
PropertyAttributes attributes() const
PropertyLocation location() const
PropertyKind kind() const
static constexpr Tagged< Smi > uninitialized_deserialization_value()
static constexpr Tagged< Smi > FromInt(int value)
static constexpr Tagged< Smi > zero()
SlotType RawFieldOfElementAt(int index) const
void set(int index, Tagged< ElementT > value, WriteBarrierMode mode=kDefaultMode)
Tagged< ElementT > get(int index) const
bool GetHeapObjectIfStrong(Tagged< HeapObject > *result) const
Tagged< HeapObject > GetHeapObjectAssumeStrong() const
bool ToSmi(Tagged< Smi > *value) const
Tagged< HeapObject > GetHeapObjectAssumeWeak() const
constexpr V8_INLINE bool IsSmi() const
static const int kSideStepTransitionsIndex
int SearchName(Tagged< Name > name, bool concurrent_search=false, int *out_insertion_index=nullptr)
static int ToKeyIndex(int transition_number)
static const int kFirstIndex
bool HasSideStepTransitions()
V8_EXPORT_PRIVATE Tagged< Map > SearchAndGetTarget(PropertyKind kind, Tagged< Name > name, PropertyAttributes attributes)
Tagged< Name > GetKey(int transition_number)
void SetKey(int transition_number, Tagged< Name > value)
static int CompareDetails(PropertyKind kind1, PropertyAttributes attributes1, PropertyKind kind2, PropertyAttributes attributes2)
bool HasPrototypeTransitions()
Tagged< MaybeObject > GetRawTarget(int transition_number)
Tagged< Map > SearchAndGetTargetForTesting(PropertyKind kind, Tagged< Name > name, PropertyAttributes attributes)
void SetPrototypeTransitions(Tagged< WeakFixedArray > prototype_transitions)
int SearchSpecial(Tagged< Symbol > symbol, bool concurrent_search=false, int *out_insertion_index=nullptr)
int BinarySearchName(Tagged< Name > name, int *out_insertion_index)
int LinearSearchName(Tagged< Name > name, int *out_insertion_index)
void SetSideStepTransitions(Tagged< WeakFixedArray > transitions)
Tagged< WeakFixedArray > GetSideStepTransitions()
HeapObjectSlot GetKeySlot(int transition_number)
void SetNumberOfTransitions(int number_of_transitions)
static int CompareKeys(Tagged< Name > key1, uint32_t hash1, PropertyKind kind1, PropertyAttributes attributes1, Tagged< Name > key2, uint32_t hash2, PropertyKind kind2, PropertyAttributes attributes2)
void SetRawTarget(int transition_number, Tagged< MaybeObject > target)
static const int kProtoTransitionNumberOfEntriesOffset
static int ToTargetIndex(int transition_number)
static const int kEntrySize
bool GetTargetIfExists(int transition_number, Isolate *isolate, Tagged< Map > *target)
Tagged< Map > GetTarget(int transition_number)
int SearchNameForTesting(Tagged< Name > name, int *out_insertion_index=nullptr)
static const int kProtoTransitionHeaderSize
void Set(int transition_number, Tagged< Name > key, Tagged< MaybeObject > target)
HeapObjectSlot GetTargetSlot(int transition_number)
static int NumberOfPrototypeTransitions(Tagged< WeakFixedArray > proto_transitions)
static const int kTransitionLengthIndex
static int CompareNames(Tagged< Name > key1, uint32_t hash1, Tagged< Name > key2, uint32_t hash2)
Tagged< WeakFixedArray > GetPrototypeTransitions()
int number_of_transitions() const
static constexpr int kNotFound
static const int kPrototypeTransitionsIndex
std::pair< Handle< String >, Handle< Map > > ExpectedTransition(base::Vector< const Char > key_chars)
bool IsExpectedTransition(Tagged< Name > transition_name, Tagged< Map > transition_target, base::Vector< const Char > key_chars)
Tagged< Map > SearchTransition(Tagged< Name > name, PropertyKind kind, PropertyAttributes attributes)
static Tagged< TransitionArray > GetTransitionArray(Isolate *isolate, Tagged< MaybeObject > raw_transitions)
PropertyDetails GetSimpleTargetDetails(Tagged< Map > transition)
void SetSideStepTransition(SideStepTransition::Kind i, Tagged< Object > target)
static Tagged< Map > GetTargetFromRaw(Tagged< MaybeObject > raw)
Tagged< MaybeObject > raw_transitions_
Tagged< TransitionArray > transitions()
static bool IsSpecialTransition(ReadOnlyRoots roots, Tagged< Name > name)
Tagged< Object > GetSideStepTransition(SideStepTransition::Kind i)
bool HasSideStepTransitions()
void ForEachTransitionWithKey(DisallowGarbageCollection *no_gc, Callback callback, ProtoCallback proto_transition_callback, SideStepCallback side_step_transition_callback)
TransitionsAccessor(Isolate *isolate, Tagged< Map > map, bool concurrent_access=false)
static PropertyDetails GetTargetDetails(Tagged< Name > name, Tagged< Map > target)
Tagged< Map > SearchSpecial(Tagged< Symbol > name)
static Tagged< Name > GetSimpleTransitionKey(Tagged< Map > transition)
Tagged< Map > GetTarget(int transition_number)
bool HasPrototypeTransitions()
static Encoding GetEncoding(Isolate *isolate, Tagged< MaybeObject > raw_transitions)
Tagged< Name > GetKey(int transition_number)
ZoneVector< RpoNumber > & result
ZoneVector< Entry > entries
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
ReadOnlyRoots GetReadOnlyRoots()
Tagged(T object) -> Tagged< T >
V8_INLINE constexpr bool IsSmi(TaggedImpl< kRefType, StorageType > obj)
kInstanceDescriptorsOffset raw_transitions
Tagged< MaybeWeak< T > > MakeWeak(Tagged< T > value)
bool IsUniqueName(Tagged< Name > obj)
SlotTraits::THeapObjectSlot HeapObjectSlot
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
static constexpr ReleaseStoreTag kReleaseStore
static constexpr RelaxedLoadTag kRelaxedLoad
static constexpr AcquireLoadTag kAcquireLoad
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK_GE(v1, v2)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
static constexpr int index_of(Kind kind)
static constexpr uint32_t kLastMapIdx
static constexpr Tagged< Smi > Empty
static constexpr uint32_t kSize
static constexpr uint32_t kFirstMapIdx
@ kObjectAssignValidityCell
static constexpr Tagged< Smi > Unreachable