5#ifndef V8_OBJECTS_TRANSITIONS_H_
6#define V8_OBJECTS_TRANSITIONS_H_
32 enum class Kind : uint32_t {
37 static constexpr uint32_t
kSize =
45 return static_cast<uint32_t
>(
kind);
81 bool concurrent_access =
false);
93 TransitionKindFlag::SPECIAL_TRANSITION);
123 template <
typename Char>
124 inline bool IsExpectedTransition(
Tagged<Name> transition_name,
128 template <
typename Char>
129 inline std::pair<Handle<String>,
Handle<Map>> ExpectedTransition(
132 template <
typename Callback,
typename ProtoCallback,
133 typename SideStepCallback>
135 ProtoCallback proto_transition_callback,
136 SideStepCallback side_step_transition_callback) {
137 ForEachTransitionWithKey<Callback, ProtoCallback, SideStepCallback, false>(
138 no_gc,
callback, proto_transition_callback,
139 side_step_transition_callback);
142 template <
typename Callback,
typename ProtoCallback,
143 typename SideStepCallback,
bool with_key =
true>
146 ProtoCallback proto_transition_callback,
147 SideStepCallback side_step_transition_callback);
149 int NumberOfTransitions();
153 static const int kMaxNumberOfTransitions = 1024 + 512;
155 inline Tagged<Map> GetTarget(
int transition_number);
164 bool HasIntegrityLevelTransitionTo(
177 TraverseTransitionTreeInternal(
callback, &no_gc);
192 static std::optional<Tagged<Map>> GetPrototypeTransition(
194 bool HasPrototypeTransitions();
205 inline bool HasSideStepTransitions();
206 static void EnsureHasSideStepTransitions(
Isolate* isolate,
212#if DEBUG || OBJECT_PRINT
213 void PrintTransitions(std::ostream& os);
216 void PrintTransitionTree();
217 void PrintTransitionTree(std::ostream& os,
int level,
221 static void CheckNewTransitionsAreConsistent(
Isolate* isolate,
224 bool IsConsistentWithBackPointers();
225 bool IsSortedNoDuplicates();
240 inline int Capacity();
268 static void EnsureHasFullTransitionArray(
Isolate* isolate,
270 static void SetPrototypeTransitions(
280 static inline void ReplaceTransitions(
283 static inline void ReplaceTransitions(
370 int* out_insertion_index =
nullptr);
423 bool concurrent_search =
false,
424 int* out_insertion_index =
nullptr);
427 int* out_insertion_index =
nullptr);
#define DISALLOW_GARBAGE_COLLECTION(name)
static constexpr Tagged< Smi > FromInt(int value)
int SearchDetails(int transition, PropertyKind kind, PropertyAttributes attributes, int *out_insertion_index)
int Search(PropertyKind kind, Tagged< Name > name, PropertyAttributes attributes, int *out_insertion_index=nullptr)
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)
static int LengthFor(int number_of_transitions)
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)
static DirectHandle< WeakFixedArray > GrowPrototypeTransitionArray(DirectHandle< WeakFixedArray > array, int new_capacity, Isolate *isolate)
V8_EXPORT_PRIVATE void Sort()
static const int kEntryKeyIndex
bool HasPrototypeTransitions()
static bool CompactPrototypeTransitionArray(Isolate *isolate, Tagged< WeakFixedArray > array)
void ForEachTransitionTo(Tagged< Name > name, const ForEachTransitionCallback &callback)
Tagged< MaybeObject > GetRawTarget(int transition_number)
Tagged< Map > SearchDetailsAndGetTarget(int transition, PropertyKind kind, PropertyAttributes attributes)
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 kEntryTargetIndex
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)
void PrintInternal(std::ostream &os)
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 void CreateSideStepTransitions(Isolate *isolate, DirectHandle< TransitionArray > transitions)
static const int kMaxCachedPrototypeTransitions
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 void SetNumberOfPrototypeTransitions(Tagged< WeakFixedArray > proto_transitions, int value)
static const int kPrototypeTransitionsIndex
Tagged< Map > GetTargetMapFromWeakRef()
static void InsertNoneSentinel(Isolate *isolate, DirectHandle< Map > map, DirectHandle< Name > name)
void ForEachTransition(DisallowGarbageCollection *no_gc, Callback callback, ProtoCallback proto_transition_callback, SideStepCallback side_step_transition_callback)
void TraverseTransitionTree(const TraverseCallback &callback)
DISALLOW_IMPLICIT_CONSTRUCTORS(TransitionsAccessor)
Tagged< MaybeObject > raw_transitions_
std::function< void(Tagged< Map >)> TraverseCallback
static void Insert(Isolate *isolate, DirectHandle< Map > map, DirectHandle< Name > name, DirectHandle< Map > target, TransitionKindFlag flag)
DisallowGarbageCollection no_gc_
std::ostream & operator<<(std::ostream &os, AtomicMemoryOrder order)
typename detail::FlattenUnionHelper< Union<>, Ts... >::type UnionOf
std::function< void(Tagged< Map >)> ForEachTransitionCallback
#define DECL_VERIFIER(Name)
#define DECL_PRINTER(Name)
#define V8_EXPORT_PRIVATE
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
friend class ObjectAssignAssembler
@ kObjectAssignValidityCell
static constexpr Tagged< Smi > Unreachable
std::unique_ptr< ValueMirror > key