| 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; | 
|  |