| Index: src/objects-inl.h
|
| diff --git a/src/objects-inl.h b/src/objects-inl.h
|
| index 6e67a77c94d2203d68f742df4db5132c4eb01c30..9e866e3317906da88babfad09de25e10e657c5b8 100644
|
| --- a/src/objects-inl.h
|
| +++ b/src/objects-inl.h
|
| @@ -1952,12 +1952,12 @@ int BinarySearch(T* array, String* name, int low, int high) {
|
| // Perform a linear search in this fixed array. len is the number of entry
|
| // indices that are valid.
|
| template<typename T>
|
| -int LinearSearch(T* array, SearchMode mode, String* name, int len) {
|
| +int LinearSearch(T* array, String* name, int len) {
|
| uint32_t hash = name->Hash();
|
| for (int number = 0; number < len; number++) {
|
| String* entry = array->GetKey(number);
|
| uint32_t current_hash = entry->Hash();
|
| - if (mode == EXPECT_SORTED && current_hash > hash) break;
|
| + if (current_hash > hash) break;
|
| if (current_hash == hash && name->Equals(entry)) return number;
|
| }
|
| return T::kNotFound;
|
| @@ -1975,7 +1975,7 @@ int Search(T* array, String* name) {
|
| // Fast case: do linear search for small arrays.
|
| const int kMaxElementsForLinearSearch = 8;
|
| if (StringShape(name).IsSymbol() && nof < kMaxElementsForLinearSearch) {
|
| - return LinearSearch(array, EXPECT_SORTED, name, nof);
|
| + return LinearSearch(array, name, nof);
|
| }
|
|
|
| // Slow case: perform binary search.
|
| @@ -2115,6 +2115,18 @@ void DescriptorArray::Append(Descriptor* desc,
|
| int descriptor_number = NumberOfSetDescriptors();
|
| int enumeration_index = descriptor_number + 1;
|
| desc->SetEnumerationIndex(enumeration_index);
|
| +
|
| + uint32_t hash = desc->GetKey()->Hash();
|
| +
|
| + for (; descriptor_number > 0; --descriptor_number) {
|
| + String* key = GetKey(descriptor_number - 1);
|
| + if (key->Hash() <= hash) break;
|
| + Object* value = GetValue(descriptor_number - 1);
|
| + PropertyDetails details = GetDetails(descriptor_number - 1);
|
| + Descriptor moved_descriptor(key, value, details);
|
| + Set(descriptor_number, &moved_descriptor, witness);
|
| + }
|
| +
|
| Set(descriptor_number, desc, witness);
|
| SetLastAdded(descriptor_number);
|
| }
|
| @@ -3489,6 +3501,39 @@ void Map::set_instance_descriptors(DescriptorArray* value,
|
| }
|
|
|
|
|
| +void Map::InitializeDescriptors(DescriptorArray* descriptors) {
|
| + int len = descriptors->number_of_descriptors();
|
| + SLOW_ASSERT(descriptors->IsSortedNoDuplicates());
|
| +
|
| +#ifdef DEBUG
|
| + bool* used_indices =
|
| + reinterpret_cast<bool*>(alloca(sizeof(*used_indices) * len));
|
| + for (int i = 0; i < len; ++i) used_indices[i] = false;
|
| +
|
| + // Ensure that all enumeration indexes between 1 and length occur uniquely in
|
| + // the descriptor array.
|
| + for (int i = 0; i < len; ++i) {
|
| + int enum_index = descriptors->GetDetails(i).index() -
|
| + PropertyDetails::kInitialIndex;
|
| + ASSERT(!used_indices[enum_index]);
|
| + used_indices[enum_index] = true;
|
| + }
|
| +#endif
|
| +
|
| + for (int i = 0; i < len; ++i) {
|
| + if (descriptors->GetDetails(i).index() == len) {
|
| + descriptors->SetLastAdded(i);
|
| + break;
|
| + }
|
| + }
|
| +
|
| + ASSERT(len == 0 ||
|
| + len == descriptors->GetDetails(descriptors->LastAdded()).index());
|
| +
|
| + set_instance_descriptors(descriptors);
|
| +}
|
| +
|
| +
|
| SMI_ACCESSORS(Map, bit_field3, kBitField3Offset)
|
|
|
|
|
|
|