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