| Index: src/transitions.cc
|
| diff --git a/src/transitions.cc b/src/transitions.cc
|
| index 3e570ff9b0ca9e9a499d1b44b05c558e4d72e883..ec1b7f4fc991f4d91ac2ce1c9fc04af7d24cd6e1 100644
|
| --- a/src/transitions.cc
|
| +++ b/src/transitions.cc
|
| @@ -41,11 +41,6 @@ void TransitionArray::NoIncrementalWriteBarrierCopyFrom(TransitionArray* origin,
|
| }
|
|
|
|
|
| -static bool InsertionPointFound(Name* key1, Name* key2) {
|
| - return key1->Hash() > key2->Hash();
|
| -}
|
| -
|
| -
|
| Handle<TransitionArray> TransitionArray::NewWith(Handle<Map> map,
|
| Handle<Name> name,
|
| Handle<Map> target,
|
| @@ -99,30 +94,36 @@ Handle<TransitionArray> TransitionArray::Insert(Handle<Map> map,
|
| int number_of_transitions = map->transitions()->number_of_transitions();
|
| int new_nof = number_of_transitions;
|
|
|
| - int insertion_index = map->transitions()->Search(*name);
|
| - if (insertion_index == kNotFound) ++new_nof;
|
| + int insertion_index = kNotFound;
|
| + int index = map->transitions()->Search(*name, &insertion_index);
|
| +
|
| + if (index == kNotFound) {
|
| + ++new_nof;
|
| + } else {
|
| + insertion_index = index;
|
| + }
|
| + DCHECK(insertion_index >= 0 && insertion_index <= number_of_transitions);
|
| +
|
| CHECK(new_nof <= kMaxNumberOfTransitions);
|
|
|
| if (new_nof <= map->transitions()->number_of_transitions_storage()) {
|
| DisallowHeapAllocation no_gc;
|
| TransitionArray* array = map->transitions();
|
|
|
| - if (insertion_index != kNotFound) {
|
| - array->SetTarget(insertion_index, *target);
|
| + if (index != kNotFound) {
|
| + array->SetTarget(index, *target);
|
| return handle(array);
|
| }
|
|
|
| array->SetNumberOfTransitions(new_nof);
|
| - uint32_t hash = name->Hash();
|
| - for (insertion_index = number_of_transitions; insertion_index > 0;
|
| - --insertion_index) {
|
| - Name* key = array->GetKey(insertion_index - 1);
|
| - if (key->Hash() <= hash) break;
|
| - array->SetKey(insertion_index, key);
|
| - array->SetTarget(insertion_index, array->GetTarget(insertion_index - 1));
|
| + for (index = number_of_transitions; index > insertion_index; --index) {
|
| + Name* key = array->GetKey(index - 1);
|
| + DCHECK(key->Hash() > name->Hash());
|
| + array->SetKey(index, key);
|
| + array->SetTarget(index, array->GetTarget(index - 1));
|
| }
|
| - array->SetKey(insertion_index, *name);
|
| - array->SetTarget(insertion_index, *target);
|
| + array->SetKey(index, *name);
|
| + array->SetTarget(index, *target);
|
| return handle(array);
|
| }
|
|
|
| @@ -142,8 +143,14 @@ Handle<TransitionArray> TransitionArray::Insert(Handle<Map> map,
|
| number_of_transitions = array->number_of_transitions();
|
| new_nof = number_of_transitions;
|
|
|
| - insertion_index = array->Search(*name);
|
| - if (insertion_index == kNotFound) ++new_nof;
|
| + insertion_index = kNotFound;
|
| + index = array->Search(*name, &insertion_index);
|
| + if (index == kNotFound) {
|
| + ++new_nof;
|
| + } else {
|
| + insertion_index = index;
|
| + }
|
| + DCHECK(insertion_index >= 0 && insertion_index <= number_of_transitions);
|
|
|
| result->Shrink(ToKeyIndex(new_nof));
|
| result->SetNumberOfTransitions(new_nof);
|
| @@ -153,18 +160,13 @@ Handle<TransitionArray> TransitionArray::Insert(Handle<Map> map,
|
| result->SetPrototypeTransitions(array->GetPrototypeTransitions());
|
| }
|
|
|
| - insertion_index = 0;
|
| - for (; insertion_index < number_of_transitions; ++insertion_index) {
|
| - if (InsertionPointFound(array->GetKey(insertion_index), *name)) break;
|
| - result->NoIncrementalWriteBarrierCopyFrom(
|
| - array, insertion_index, insertion_index);
|
| + DCHECK_NE(kNotFound, insertion_index);
|
| + for (int i = 0; i < insertion_index; ++i) {
|
| + result->NoIncrementalWriteBarrierCopyFrom(array, i, i);
|
| }
|
| -
|
| result->NoIncrementalWriteBarrierSet(insertion_index, *name, *target);
|
| -
|
| - for (; insertion_index < number_of_transitions; ++insertion_index) {
|
| - result->NoIncrementalWriteBarrierCopyFrom(
|
| - array, insertion_index, insertion_index + 1);
|
| + for (int i = insertion_index; i < number_of_transitions; ++i) {
|
| + result->NoIncrementalWriteBarrierCopyFrom(array, i, i + 1);
|
| }
|
|
|
| result->set_back_pointer_storage(array->back_pointer_storage());
|
|
|