OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_TRANSITIONS_H_ | 5 #ifndef V8_TRANSITIONS_H_ |
6 #define V8_TRANSITIONS_H_ | 6 #define V8_TRANSITIONS_H_ |
7 | 7 |
8 #include "src/checks.h" | 8 #include "src/checks.h" |
9 #include "src/elements-kind.h" | 9 #include "src/elements-kind.h" |
10 #include "src/heap/heap.h" | 10 #include "src/heap/heap.h" |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 WeakCell::cast(raw_transition)->cleared() || | 64 WeakCell::cast(raw_transition)->cleared() || |
65 WeakCell::cast(raw_transition)->value()->IsMap()); | 65 WeakCell::cast(raw_transition)->value()->IsMap()); |
66 return raw_transition->IsWeakCell() && | 66 return raw_transition->IsWeakCell() && |
67 !WeakCell::cast(raw_transition)->cleared(); | 67 !WeakCell::cast(raw_transition)->cleared(); |
68 } | 68 } |
69 static inline Map* GetSimpleTransition(Object* raw_transition) { | 69 static inline Map* GetSimpleTransition(Object* raw_transition) { |
70 DCHECK(IsSimpleTransition(raw_transition)); | 70 DCHECK(IsSimpleTransition(raw_transition)); |
71 DCHECK(raw_transition->IsWeakCell()); | 71 DCHECK(raw_transition->IsWeakCell()); |
72 return Map::cast(WeakCell::cast(raw_transition)->value()); | 72 return Map::cast(WeakCell::cast(raw_transition)->value()); |
73 } | 73 } |
| 74 static inline WeakCell* GetSimpleTransitionCell(Object* raw_transition) { |
| 75 DCHECK(IsSimpleTransition(raw_transition)); |
| 76 DCHECK(raw_transition->IsWeakCell()); |
| 77 return WeakCell::cast(raw_transition); |
| 78 } |
74 static inline bool IsFullTransitionArray(Object* raw_transitions) { | 79 static inline bool IsFullTransitionArray(Object* raw_transitions) { |
75 return raw_transitions->IsTransitionArray(); | 80 return raw_transitions->IsTransitionArray(); |
76 } | 81 } |
77 | 82 |
78 // The size of transition arrays are limited so they do not end up in large | 83 // The size of transition arrays are limited so they do not end up in large |
79 // object space. Otherwise ClearNonLiveReferences would leak memory while | 84 // object space. Otherwise ClearNonLiveReferences would leak memory while |
80 // applying in-place right trimming. | 85 // applying in-place right trimming. |
81 static bool CanHaveMoreTransitions(Handle<Map> map); | 86 static bool CanHaveMoreTransitions(Handle<Map> map); |
82 | 87 |
83 // ===== PROTOTYPE TRANSITIONS ===== | 88 // ===== PROTOTYPE TRANSITIONS ===== |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 TraverseTransitionTreeInternal(map, callback, data); | 133 TraverseTransitionTreeInternal(map, callback, data); |
129 } | 134 } |
130 | 135 |
131 // ===== LOW-LEVEL ACCESSORS ===== | 136 // ===== LOW-LEVEL ACCESSORS ===== |
132 | 137 |
133 // Accessors for fetching instance transition at transition number. | 138 // Accessors for fetching instance transition at transition number. |
134 static inline Name* GetKey(Object* raw_transitions, int transition_number); | 139 static inline Name* GetKey(Object* raw_transitions, int transition_number); |
135 inline Name* GetKey(int transition_number); | 140 inline Name* GetKey(int transition_number); |
136 inline void SetKey(int transition_number, Name* value); | 141 inline void SetKey(int transition_number, Name* value); |
137 inline Object** GetKeySlot(int transition_number); | 142 inline Object** GetKeySlot(int transition_number); |
| 143 inline Object** GetTargetSlot(int transition_number); |
138 int GetSortedKeyIndex(int transition_number) { return transition_number; } | 144 int GetSortedKeyIndex(int transition_number) { return transition_number; } |
139 | 145 |
140 Name* GetSortedKey(int transition_number) { | 146 Name* GetSortedKey(int transition_number) { |
141 return GetKey(transition_number); | 147 return GetKey(transition_number); |
142 } | 148 } |
143 | 149 |
144 static inline Map* GetTarget(Object* raw_transitions, int transition_number); | 150 static inline Map* GetTarget(Object* raw_transitions, int transition_number); |
145 inline Map* GetTarget(int transition_number); | 151 inline Map* GetTarget(int transition_number); |
146 inline void SetTarget(int transition_number, Map* target); | 152 |
| 153 inline WeakCell* GetTargetCell(int transition_number); |
| 154 inline void SetTargetCell(int transition_number, WeakCell* target); |
147 | 155 |
148 static inline PropertyDetails GetTargetDetails(Name* name, Map* target); | 156 static inline PropertyDetails GetTargetDetails(Name* name, Map* target); |
149 | 157 |
150 // Returns the number of transitions in the array. | 158 // Returns the number of transitions in the array. |
151 static int NumberOfTransitions(Object* raw_transitions); | 159 static int NumberOfTransitions(Object* raw_transitions); |
152 // Required for templatized Search interface. | 160 // Required for templatized Search interface. |
153 inline int number_of_entries() { return number_of_transitions(); } | 161 inline int number_of_entries() { return number_of_transitions(); } |
154 | 162 |
155 inline void SetNumberOfTransitions(int number_of_transitions); | 163 inline void SetNumberOfTransitions(int number_of_transitions); |
156 | 164 |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 static inline int CompareNames(Name* key1, uint32_t hash1, Name* key2, | 284 static inline int CompareNames(Name* key1, uint32_t hash1, Name* key2, |
277 uint32_t hash2); | 285 uint32_t hash2); |
278 | 286 |
279 // Compares two details, returns -1 if details1 is "less" than details2, | 287 // Compares two details, returns -1 if details1 is "less" than details2, |
280 // 0 if details1 equal to details2 and 1 otherwise. | 288 // 0 if details1 equal to details2 and 1 otherwise. |
281 static inline int CompareDetails(PropertyKind kind1, | 289 static inline int CompareDetails(PropertyKind kind1, |
282 PropertyAttributes attributes1, | 290 PropertyAttributes attributes1, |
283 PropertyKind kind2, | 291 PropertyKind kind2, |
284 PropertyAttributes attributes2); | 292 PropertyAttributes attributes2); |
285 | 293 |
286 inline void NoIncrementalWriteBarrierSet(int transition_number, | 294 inline void Set(int transition_number, Name* key, WeakCell* target_cell); |
287 Name* key, | |
288 Map* target); | |
289 | 295 |
290 // Copy a single transition from the origin array. | 296 // Copy a single transition from the origin array. |
291 inline void NoIncrementalWriteBarrierCopyFrom(TransitionArray* origin, | 297 inline void CopyFrom(TransitionArray* origin, int origin_transition, |
292 int origin_transition, | 298 int target_transition); |
293 int target_transition); | |
294 | 299 |
295 #ifdef DEBUG | 300 #ifdef DEBUG |
296 static void CheckNewTransitionsAreConsistent(Handle<Map> map, | 301 static void CheckNewTransitionsAreConsistent(Handle<Map> map, |
297 TransitionArray* old_transitions, | 302 TransitionArray* old_transitions, |
298 Object* transitions); | 303 Object* transitions); |
299 #endif | 304 #endif |
300 | 305 |
301 DISALLOW_IMPLICIT_CONSTRUCTORS(TransitionArray); | 306 DISALLOW_IMPLICIT_CONSTRUCTORS(TransitionArray); |
302 }; | 307 }; |
303 | 308 |
304 | 309 |
305 } } // namespace v8::internal | 310 } } // namespace v8::internal |
306 | 311 |
307 #endif // V8_TRANSITIONS_H_ | 312 #endif // V8_TRANSITIONS_H_ |
OLD | NEW |