| Index: src/objects-inl.h
 | 
| diff --git a/src/objects-inl.h b/src/objects-inl.h
 | 
| index 51e8f3f2f3e8de2a18020382e271dc3ee22b1cb1..0fe0f6d5c56d295f6dc680807ae34651f64484fc 100644
 | 
| --- a/src/objects-inl.h
 | 
| +++ b/src/objects-inl.h
 | 
| @@ -2072,23 +2072,28 @@ int HashTable<Shape, Key>::FindEntry(Isolate* isolate, Key key) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -bool NumberDictionary::requires_slow_elements() {
 | 
| -  Object* max_index_object = get(kMaxNumberKeyIndex);
 | 
| +bool NumberDictionaryBase::requires_slow_elements() {
 | 
| +  Object* max_index_object = as_dict()->get(
 | 
| +      NumberDictionary::kMaxNumberKeyIndex);
 | 
|    if (!max_index_object->IsSmi()) return false;
 | 
|    return 0 !=
 | 
| -      (Smi::cast(max_index_object)->value() & kRequiresSlowElementsMask);
 | 
| +      (Smi::cast(max_index_object)->value() &
 | 
| +       NumberDictionary::kRequiresSlowElementsMask);
 | 
|  }
 | 
|  
 | 
| -uint32_t NumberDictionary::max_number_key() {
 | 
| +uint32_t NumberDictionaryBase::max_number_key() {
 | 
|    ASSERT(!requires_slow_elements());
 | 
| -  Object* max_index_object = get(kMaxNumberKeyIndex);
 | 
| +  Object* max_index_object = as_dict()->get(
 | 
| +      NumberDictionary::kMaxNumberKeyIndex);
 | 
|    if (!max_index_object->IsSmi()) return 0;
 | 
|    uint32_t value = static_cast<uint32_t>(Smi::cast(max_index_object)->value());
 | 
| -  return value >> kRequiresSlowElementsTagSize;
 | 
| +  return value >> NumberDictionary::kRequiresSlowElementsTagSize;
 | 
|  }
 | 
|  
 | 
| -void NumberDictionary::set_requires_slow_elements() {
 | 
| -  set(kMaxNumberKeyIndex, Smi::FromInt(kRequiresSlowElementsMask));
 | 
| +void NumberDictionaryBase::set_requires_slow_elements() {
 | 
| +  as_dict()->set(
 | 
| +      NumberDictionary::kMaxNumberKeyIndex,
 | 
| +      Smi::FromInt(NumberDictionary::kRequiresSlowElementsMask));
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -4532,37 +4537,44 @@ void Dictionary<Shape, Key>::SetEntry(int entry,
 | 
|  }
 | 
|  
 | 
|  
 | 
| -bool NumberDictionaryShape::IsMatch(uint32_t key, Object* other) {
 | 
| +template <NumberDictionaryKind kind>
 | 
| +bool NumberDictionaryShape<kind>::IsMatch(uint32_t key, Object* other) {
 | 
|    ASSERT(other->IsNumber());
 | 
|    return key == static_cast<uint32_t>(other->Number());
 | 
|  }
 | 
|  
 | 
|  
 | 
| -uint32_t NumberDictionaryShape::Hash(uint32_t key) {
 | 
| -  // This function is unreachable, since shape has UsesSeed=true flag.
 | 
| -  UNREACHABLE();
 | 
| -  return 0;
 | 
| +template <NumberDictionaryKind kind>
 | 
| +uint32_t NumberDictionaryShape<kind>::Hash(uint32_t key) {
 | 
| +  return ComputeIntegerHash(key, 0);
 | 
|  }
 | 
|  
 | 
|  
 | 
| -uint32_t NumberDictionaryShape::HashForObject(uint32_t key, Object* other) {
 | 
| -  // This function is unreachable, since shape has UsesSeed=true flag.
 | 
| -  UNREACHABLE();
 | 
| -  return 0;
 | 
| +template <NumberDictionaryKind kind>
 | 
| +uint32_t NumberDictionaryShape<kind>::HashForObject(uint32_t key,
 | 
| +                                                    Object* other) {
 | 
| +  ASSERT(other->IsNumber());
 | 
| +  return ComputeIntegerHash(static_cast<uint32_t>(other->Number()), 0);
 | 
|  }
 | 
|  
 | 
| -uint32_t NumberDictionaryShape::SeededHash(uint32_t key, uint32_t seed) {
 | 
| +
 | 
| +template <NumberDictionaryKind kind>
 | 
| +uint32_t NumberDictionaryShape<kind>::SeededHash(uint32_t key, uint32_t seed) {
 | 
|    return ComputeIntegerHash(key, seed);
 | 
|  }
 | 
|  
 | 
| -uint32_t NumberDictionaryShape::SeededHashForObject(uint32_t key,
 | 
| -                                                    uint32_t seed,
 | 
| -                                                    Object* other) {
 | 
| +
 | 
| +template <NumberDictionaryKind kind>
 | 
| +uint32_t NumberDictionaryShape<kind>::SeededHashForObject(uint32_t key,
 | 
| +                                                          uint32_t seed,
 | 
| +                                                          Object* other) {
 | 
|    ASSERT(other->IsNumber());
 | 
|    return ComputeIntegerHash(static_cast<uint32_t>(other->Number()), seed);
 | 
|  }
 | 
|  
 | 
| -MaybeObject* NumberDictionaryShape::AsObject(uint32_t key) {
 | 
| +
 | 
| +template <NumberDictionaryKind kind>
 | 
| +MaybeObject* NumberDictionaryShape<kind>::AsObject(uint32_t key) {
 | 
|    return Isolate::Current()->heap()->NumberFromUint32(key);
 | 
|  }
 | 
|  
 | 
| 
 |