| Index: src/objects-inl.h | 
| diff --git a/src/objects-inl.h b/src/objects-inl.h | 
| index 8b22755c8230211278b9874ce97415cdb4fcf9f2..92b312456d80a4d6bae5a2e81efb395952639175 100644 | 
| --- a/src/objects-inl.h | 
| +++ b/src/objects-inl.h | 
| @@ -520,6 +520,11 @@ TYPE_CHECKER(FixedArray, FIXED_ARRAY_TYPE) | 
| TYPE_CHECKER(FixedDoubleArray, FIXED_DOUBLE_ARRAY_TYPE) | 
|  | 
|  | 
| +bool Object::IsHiddenPropertiesArray() { | 
| +  return IsFixedArray(); | 
| +} | 
| + | 
| + | 
| bool Object::IsDescriptorArray() { | 
| return IsFixedArray(); | 
| } | 
| @@ -1879,6 +1884,72 @@ Object** FixedArray::data_start() { | 
| } | 
|  | 
|  | 
| +MaybeObject* HiddenPropertiesArray::Allocate() { | 
| +  static const int initial_size = 2; | 
| +  ASSERT(IS_POWER_OF_TWO(initial_size)); | 
| +  return Isolate::Current()->heap()->AllocateFixedArrayWithHoles(initial_size); | 
| +} | 
| + | 
| + | 
| +MaybeObject* HiddenPropertiesArray::Set(String* key, Object* value) { | 
| +  for (int i = 0; i < length(); i += 2) { | 
| +    if (is_the_hole(i) || String::cast(get(i))->Equals(key)) { | 
| +      set(i, key); | 
| +      set(i + 1, value); | 
| +      return this; | 
| +    } | 
| +  } | 
| +  // Need to extend the backing store. | 
| +  int old_size = length(); | 
| +  int new_size = old_size << 1; | 
| +  ASSERT(IS_POWER_OF_TWO(new_size)); | 
| +  FixedArray* new_array; | 
| +  { MaybeObject* maybe_obj = GetHeap()->AllocateFixedArrayWithHoles(new_size); | 
| +    if (!maybe_obj->To<FixedArray>(&new_array)) return maybe_obj; | 
| +  } | 
| +  CopyTo(0, new_array, 0, old_size); | 
| +  new_array->set(old_size, key); | 
| +  new_array->set(old_size + 1, value); | 
| +  return new_array; | 
| +} | 
| + | 
| + | 
| +void HiddenPropertiesArray::Delete(String* key) { | 
| +  // Linear search to find the key and delete the entry. | 
| +  for (int i = 0; i < length(); i += 2) { | 
| +    if (is_the_hole(i)) { | 
| +      if (is_the_hole(i + 1)) { | 
| +        // Both key and value are holes.  This is the end of the list. | 
| +        return; | 
| +      } | 
| +    } else if (String::cast(get(i))->Equals(key)) { | 
| +      // Set the value field to undefined (not the hole) to signal that the | 
| +      // list may not end here. | 
| +      set_the_hole(i); | 
| +      set_undefined(i + 1); | 
| +      return; | 
| +    } | 
| +  } | 
| +} | 
| + | 
| + | 
| +Object* HiddenPropertiesArray::Get(String* key) { | 
| +  // Linear search to find the key and return the value. | 
| +  for (int i = 0; i < length(); i += 2) { | 
| +    if (is_the_hole(i)) { | 
| +      if (is_the_hole(i + 1)) { | 
| +        // Both key and value are holes.  This is the end of the list. | 
| +        break; | 
| +      } | 
| +    } else if (String::cast(get(i))->Equals(key)) { | 
| +      return get(i + 1); | 
| +    } | 
| +  } | 
| +  // Not found, return undefined. | 
| +  return GetHeap()->undefined_value(); | 
| +} | 
| + | 
| + | 
| bool DescriptorArray::IsEmpty() { | 
| ASSERT(length() >= kFirstIndex || | 
| this == HEAP->empty_descriptor_array()); | 
| @@ -2219,6 +2290,7 @@ void SeededNumberDictionary::set_requires_slow_elements() { | 
|  | 
| CAST_ACCESSOR(FixedArray) | 
| CAST_ACCESSOR(FixedDoubleArray) | 
| +CAST_ACCESSOR(HiddenPropertiesArray) | 
| CAST_ACCESSOR(DescriptorArray) | 
| CAST_ACCESSOR(DeoptimizationInputData) | 
| CAST_ACCESSOR(DeoptimizationOutputData) | 
|  |