Index: src/objects.h |
diff --git a/src/objects.h b/src/objects.h |
index 8b6f1e2e621c39339c02891c090b12b83add0df8..7ad1c29854a86bfe24691d4cec300ac0ce11f534 100644 |
--- a/src/objects.h |
+++ b/src/objects.h |
@@ -5880,6 +5880,7 @@ class Map: public HeapObject { |
inline FixedArrayBase* GetInitialElements(); |
DECL_ACCESSORS(transitions, TransitionArray) |
+ inline void init_transitions(Object* undefined); |
static inline Handle<String> ExpectedTransitionKey(Handle<Map> map); |
static inline Handle<Map> ExpectedTransitionTarget(Handle<Map> map); |
@@ -5954,7 +5955,16 @@ class Map: public HeapObject { |
bool CanUseOptimizationsBasedOnPrototypeRegistry(); |
// [constructor]: points back to the function responsible for this map. |
- DECL_ACCESSORS(constructor, Object) |
+ // The field overlaps with the back pointer. All maps in a transition tree |
+ // have the same constructor, so maps with back pointers can walk the |
+ // back pointer chain until they find the map holding their constructor. |
+ DECL_ACCESSORS(constructor_or_backpointer, Object) |
+ inline Object* GetConstructor() const; |
+ inline void SetConstructor(Object* constructor, |
+ WriteBarrierMode mode = UPDATE_WRITE_BARRIER); |
+ inline Object* GetBackPointer(); |
+ inline void SetBackPointer(Object* value, |
+ WriteBarrierMode mode = UPDATE_WRITE_BARRIER); |
// [instance descriptors]: describes the object. |
DECL_ACCESSORS(instance_descriptors, DescriptorArray) |
@@ -5981,15 +5991,6 @@ class Map: public HeapObject { |
// [dependent code]: list of optimized codes that weakly embed this map. |
DECL_ACCESSORS(dependent_code, DependentCode) |
- // [back pointer]: points back to the parent map from which a transition |
- // leads to this map. The field overlaps with prototype transitions and the |
- // back pointer will be moved into the prototype transitions array if |
- // required. |
- inline Object* GetBackPointer(); |
- inline void SetBackPointer(Object* value, |
- WriteBarrierMode mode = UPDATE_WRITE_BARRIER); |
- inline void init_back_pointer(Object* undefined); |
- |
// [prototype transitions]: cache of prototype transitions. |
// Prototype transition is a transition that happens |
// when we change object's prototype to a new one. |
@@ -6282,15 +6283,11 @@ class Map: public HeapObject { |
static const int kInstanceAttributesOffset = kInstanceSizesOffset + kIntSize; |
static const int kBitField3Offset = kInstanceAttributesOffset + kIntSize; |
static const int kPrototypeOffset = kBitField3Offset + kPointerSize; |
- static const int kConstructorOffset = kPrototypeOffset + kPointerSize; |
- // Storage for the transition array is overloaded to directly contain a back |
- // pointer if unused. When the map has transitions, the back pointer is |
- // transferred to the transition array and accessed through an extra |
- // indirection. |
- static const int kTransitionsOrBackPointerOffset = |
- kConstructorOffset + kPointerSize; |
- static const int kDescriptorsOffset = |
- kTransitionsOrBackPointerOffset + kPointerSize; |
+ static const int kConstructorOrBackPointerOffset = |
+ kPrototypeOffset + kPointerSize; |
+ static const int kTransitionsOffset = |
+ kConstructorOrBackPointerOffset + kPointerSize; |
+ static const int kDescriptorsOffset = kTransitionsOffset + kPointerSize; |
#if V8_DOUBLE_FIELDS_UNBOXING |
static const int kLayoutDecriptorOffset = kDescriptorsOffset + kPointerSize; |
static const int kCodeCacheOffset = kLayoutDecriptorOffset + kPointerSize; |