Index: src/transitions.h |
diff --git a/src/transitions.h b/src/transitions.h |
index 7abef47346870a012fc1e6c86c1b52bec10aa3ae..fde1279895205efa5f227001e9c1d4f2a4480f47 100644 |
--- a/src/transitions.h |
+++ b/src/transitions.h |
@@ -41,10 +41,10 @@ namespace internal { |
// TransitionArrays are fixed arrays used to hold map transitions for property, |
// constant, and element changes. They can either be simple transition arrays |
// that store a single property transition, or a full transition array that has |
-// space for elements transitions, prototype transitions and multiple property |
-// transitons. The details related to property transitions are accessed in the |
-// descriptor array of the target map. In the case of a simple transition, the |
-// key is also read from the descriptor array of the target map. |
+// prototype transitions and multiple property transitons. The details related |
+// to property transitions are accessed in the descriptor array of the target |
+// map. In the case of a simple transition, the key is also read from the |
+// descriptor array of the target map. |
// |
// The simple format of the these objects is: |
// [0] Undefined or back pointer map |
@@ -52,9 +52,8 @@ namespace internal { |
// |
// The full format is: |
// [0] Undefined or back pointer map |
-// [1] Smi(0) or elements transition map |
-// [2] Smi(0) or fixed array of prototype transitions |
-// [3] First transition |
+// [1] Smi(0) or fixed array of prototype transitions |
+// [2] First transition |
// [length() - kTransitionSize] Last transition |
class TransitionArray: public FixedArray { |
public: |
@@ -73,12 +72,7 @@ class TransitionArray: public FixedArray { |
inline PropertyDetails GetTargetDetails(int transition_number); |
- inline Map* elements_transition(); |
- inline void set_elements_transition( |
- Map* target, |
- WriteBarrierMode mode = UPDATE_WRITE_BARRIER); |
inline bool HasElementsTransition(); |
- inline void ClearElementsTransition(); |
inline Object* back_pointer_storage(); |
inline void set_back_pointer_storage( |
@@ -127,8 +121,21 @@ class TransitionArray: public FixedArray { |
// Allocates a TransitionArray. |
MUST_USE_RESULT static MaybeObject* Allocate(int number_of_transitions); |
- bool IsSimpleTransition() { return length() == kSimpleTransitionSize; } |
- bool IsFullTransitionArray() { return length() >= kFirstIndex; } |
+ bool IsSimpleTransition() { |
+ return length() == kSimpleTransitionSize && |
+ get(kSimpleTransitionTarget)->IsHeapObject() && |
+ // The IntrusivePrototypeTransitionIterator may have set the map of the |
+ // prototype transitions array to a smi. In that case, there are |
+ // prototype transitions, hence this transition array is a full |
+ // transition array. |
+ HeapObject::cast(get(kSimpleTransitionTarget))->map()->IsMap() && |
+ get(kSimpleTransitionTarget)->IsMap(); |
+ } |
+ |
+ bool IsFullTransitionArray() { |
+ return length() > kFirstIndex || |
+ (length() == kFirstIndex && !IsSimpleTransition()); |
+ } |
// Casting. |
static inline TransitionArray* cast(Object* obj); |
@@ -139,9 +146,8 @@ class TransitionArray: public FixedArray { |
static const int kBackPointerStorageIndex = 0; |
// Layout for full transition arrays. |
- static const int kElementsTransitionIndex = 1; |
- static const int kPrototypeTransitionsIndex = 2; |
- static const int kFirstIndex = 3; |
+ static const int kPrototypeTransitionsIndex = 1; |
+ static const int kFirstIndex = 2; |
// Layout for simple transition arrays. |
static const int kSimpleTransitionTarget = 1; |
@@ -152,9 +158,7 @@ class TransitionArray: public FixedArray { |
static const int kBackPointerStorageOffset = FixedArray::kHeaderSize; |
// Layout for the full transition array header. |
- static const int kElementsTransitionOffset = kBackPointerStorageOffset + |
- kPointerSize; |
- static const int kPrototypeTransitionsOffset = kElementsTransitionOffset + |
+ static const int kPrototypeTransitionsOffset = kBackPointerStorageOffset + |
kPointerSize; |
// Layout of map transition entries in full transition arrays. |