| Index: src/objects.h
 | 
| diff --git a/src/objects.h b/src/objects.h
 | 
| index 9b5d7358aee149aa12c110ebad5efd3601598aeb..a5108f43caf4e8698266992324e14f31198ec941 100644
 | 
| --- a/src/objects.h
 | 
| +++ b/src/objects.h
 | 
| @@ -3459,6 +3459,11 @@ class HashTable : public HashTableBase {
 | 
|    static const int kCapacityOffset =
 | 
|        kHeaderSize + kCapacityIndex * kPointerSize;
 | 
|  
 | 
| +  // Returns the index for an entry (of the key)
 | 
| +  static inline int EntryToIndex(int entry) {
 | 
| +    return (entry * kEntrySize) + kElementsStartIndex;
 | 
| +  }
 | 
| +
 | 
|   protected:
 | 
|    friend class ObjectHashTable;
 | 
|  
 | 
| @@ -3476,11 +3481,6 @@ class HashTable : public HashTableBase {
 | 
|        Key key,
 | 
|        PretenureFlag pretenure = NOT_TENURED);
 | 
|  
 | 
| -  // Returns the index for an entry (of the key)
 | 
| -  static inline int EntryToIndex(int entry) {
 | 
| -    return (entry * kEntrySize) + kElementsStartIndex;
 | 
| -  }
 | 
| -
 | 
|    // Sets the capacity of the hash table.
 | 
|    void SetCapacity(int capacity) {
 | 
|      // To scale a computed hash code to fit within the hash table, we
 | 
| @@ -3606,14 +3606,12 @@ class Dictionary: public HashTable<Derived, Shape, Key> {
 | 
|  
 | 
|    // Returns the property details for the property at entry.
 | 
|    PropertyDetails DetailsAt(int entry) {
 | 
| -    DCHECK(entry >= 0);  // Not found is -1, which is not caught by get().
 | 
| -    return PropertyDetails(
 | 
| -        Smi::cast(this->get(Derived::EntryToIndex(entry) + 2)));
 | 
| +    return Shape::DetailsAt(static_cast<Derived*>(this), entry);
 | 
|    }
 | 
|  
 | 
|    // Set the details for entry.
 | 
|    void DetailsAtPut(int entry, PropertyDetails value) {
 | 
| -    this->set(Derived::EntryToIndex(entry) + 2, value.AsSmi());
 | 
| +    Shape::DetailsAtPut(static_cast<Derived*>(this), entry, value);
 | 
|    }
 | 
|  
 | 
|    // Returns true if property at given entry is deleted.
 | 
| @@ -3746,9 +3744,28 @@ template <typename Key>
 | 
|  class BaseDictionaryShape : public BaseShape<Key> {
 | 
|   public:
 | 
|    template <typename Dictionary>
 | 
| +  static inline PropertyDetails DetailsAt(Dictionary* dict, int entry) {
 | 
| +    STATIC_ASSERT(Dictionary::kEntrySize == 3);
 | 
| +    DCHECK(entry >= 0);  // Not found is -1, which is not caught by get().
 | 
| +    return PropertyDetails(
 | 
| +        Smi::cast(dict->get(Dictionary::EntryToIndex(entry) + 2)));
 | 
| +  }
 | 
| +
 | 
| +  template <typename Dictionary>
 | 
| +  static inline void DetailsAtPut(Dictionary* dict, int entry,
 | 
| +                                  PropertyDetails value) {
 | 
| +    STATIC_ASSERT(Dictionary::kEntrySize == 3);
 | 
| +    dict->set(Dictionary::EntryToIndex(entry) + 2, value.AsSmi());
 | 
| +  }
 | 
| +
 | 
| +  template <typename Dictionary>
 | 
|    static bool IsDeleted(Dictionary* dict, int entry) {
 | 
|      return false;
 | 
|    }
 | 
| +
 | 
| +  template <typename Dictionary>
 | 
| +  static inline void SetEntry(Dictionary* dict, int entry, Handle<Object> key,
 | 
| +                              Handle<Object> value, PropertyDetails details);
 | 
|  };
 | 
|  
 | 
|  
 | 
| @@ -3779,10 +3796,21 @@ class NameDictionary
 | 
|  
 | 
|  class GlobalDictionaryShape : public NameDictionaryShape {
 | 
|   public:
 | 
| -  static const int kEntrySize = 3;  // Overrides NameDictionaryShape::kEntrySize
 | 
| +  static const int kEntrySize = 2;  // Overrides NameDictionaryShape::kEntrySize
 | 
| +
 | 
| +  template <typename Dictionary>
 | 
| +  static inline PropertyDetails DetailsAt(Dictionary* dict, int entry);
 | 
| +
 | 
| +  template <typename Dictionary>
 | 
| +  static inline void DetailsAtPut(Dictionary* dict, int entry,
 | 
| +                                  PropertyDetails value);
 | 
|  
 | 
|    template <typename Dictionary>
 | 
|    static bool IsDeleted(Dictionary* dict, int entry);
 | 
| +
 | 
| +  template <typename Dictionary>
 | 
| +  static inline void SetEntry(Dictionary* dict, int entry, Handle<Object> key,
 | 
| +                              Handle<Object> value, PropertyDetails details);
 | 
|  };
 | 
|  
 | 
|  
 | 
| @@ -9868,12 +9896,22 @@ class Cell: public HeapObject {
 | 
|  
 | 
|  class PropertyCell : public HeapObject {
 | 
|   public:
 | 
| +  // [property_details]: details of the global property.
 | 
| +  DECL_ACCESSORS(property_details_raw, Object)
 | 
|    // [value]: value of the global property.
 | 
|    DECL_ACCESSORS(value, Object)
 | 
|    // [dependent_code]: dependent code that depends on the type of the global
 | 
|    // property.
 | 
|    DECL_ACCESSORS(dependent_code, DependentCode)
 | 
|  
 | 
| +  PropertyDetails property_details() {
 | 
| +    return PropertyDetails(Smi::cast(property_details_raw()));
 | 
| +  }
 | 
| +
 | 
| +  void set_property_details(PropertyDetails details) {
 | 
| +    set_property_details_raw(details.AsSmi());
 | 
| +  }
 | 
| +
 | 
|    PropertyCellConstantType GetConstantType();
 | 
|  
 | 
|    // Computes the new type of the cell's contents for the given value, but
 | 
| @@ -9897,7 +9935,8 @@ class PropertyCell : public HeapObject {
 | 
|    DECLARE_VERIFIER(PropertyCell)
 | 
|  
 | 
|    // Layout description.
 | 
| -  static const int kValueOffset = HeapObject::kHeaderSize;
 | 
| +  static const int kDetailsOffset = HeapObject::kHeaderSize;
 | 
| +  static const int kValueOffset = kDetailsOffset + kPointerSize;
 | 
|    static const int kDependentCodeOffset = kValueOffset + kPointerSize;
 | 
|    static const int kSize = kDependentCodeOffset + kPointerSize;
 | 
|  
 | 
| 
 |