diff options
Diffstat (limited to 'deps/v8/src/transitions.cc')
-rw-r--r-- | deps/v8/src/transitions.cc | 80 |
1 files changed, 56 insertions, 24 deletions
diff --git a/deps/v8/src/transitions.cc b/deps/v8/src/transitions.cc index 6f8b2fec5a..56b6caf3db 100644 --- a/deps/v8/src/transitions.cc +++ b/deps/v8/src/transitions.cc @@ -35,28 +35,33 @@ namespace v8 { namespace internal { -MaybeObject* TransitionArray::Allocate(int number_of_transitions) { +static MaybeObject* AllocateRaw(int length) { Heap* heap = Isolate::Current()->heap(); - // Use FixedArray to not use DescriptorArray::cast on incomplete object. + + // Use FixedArray to not use TransitionArray::cast on incomplete object. FixedArray* array; - MaybeObject* maybe_array = - heap->AllocateFixedArray(ToKeyIndex(number_of_transitions)); + MaybeObject* maybe_array = heap->AllocateFixedArray(length); if (!maybe_array->To(&array)) return maybe_array; + return array; +} + +MaybeObject* TransitionArray::Allocate(int number_of_transitions) { + FixedArray* array; + MaybeObject* maybe_array = AllocateRaw(ToKeyIndex(number_of_transitions)); + if (!maybe_array->To(&array)) return maybe_array; array->set(kElementsTransitionIndex, Smi::FromInt(0)); array->set(kPrototypeTransitionsIndex, Smi::FromInt(0)); return array; } -void TransitionArray::CopyFrom(TransitionArray* origin, - int origin_transition, - int target_transition, - const WhitenessWitness& witness) { - Set(target_transition, - origin->GetKey(origin_transition), - origin->GetTarget(origin_transition), - witness); +void TransitionArray::NoIncrementalWriteBarrierCopyFrom(TransitionArray* origin, + int origin_transition, + int target_transition) { + NoIncrementalWriteBarrierSet(target_transition, + origin->GetKey(origin_transition), + origin->GetTarget(origin_transition)); } @@ -65,15 +70,39 @@ static bool InsertionPointFound(String* key1, String* key2) { } -MaybeObject* TransitionArray::NewWith(String* name, Map* target) { +MaybeObject* TransitionArray::NewWith(SimpleTransitionFlag flag, + String* key, + Map* target, + Object* back_pointer) { TransitionArray* result; + MaybeObject* maybe_result; + + if (flag == SIMPLE_TRANSITION) { + maybe_result = AllocateRaw(kSimpleTransitionSize); + if (!maybe_result->To(&result)) return maybe_result; + result->set(kSimpleTransitionTarget, target); + } else { + maybe_result = Allocate(1); + if (!maybe_result->To(&result)) return maybe_result; + result->NoIncrementalWriteBarrierSet(0, key, target); + } + result->set_back_pointer_storage(back_pointer); + return result; +} - MaybeObject* maybe_array = TransitionArray::Allocate(1); - if (!maybe_array->To(&result)) return maybe_array; - FixedArray::WhitenessWitness witness(result); +MaybeObject* TransitionArray::ExtendToFullTransitionArray() { + ASSERT(!IsFullTransitionArray()); + int nof = number_of_transitions(); + TransitionArray* result; + MaybeObject* maybe_result = Allocate(nof); + if (!maybe_result->To(&result)) return maybe_result; + + if (nof == 1) { + result->NoIncrementalWriteBarrierCopyFrom(this, kSimpleTransitionIndex, 0); + } - result->Set(0, name, target, witness); + result->set_back_pointer_storage(back_pointer_storage()); return result; } @@ -99,28 +128,31 @@ MaybeObject* TransitionArray::CopyInsert(String* name, Map* target) { result->SetPrototypeTransitions(GetPrototypeTransitions()); } - FixedArray::WhitenessWitness witness(result); - if (insertion_index != kNotFound) { for (int i = 0; i < number_of_transitions; ++i) { - if (i != insertion_index) result->CopyFrom(this, i, i, witness); + if (i != insertion_index) { + result->NoIncrementalWriteBarrierCopyFrom(this, i, i); + } } - result->Set(insertion_index, name, target, witness); + result->NoIncrementalWriteBarrierSet(insertion_index, name, target); return result; } insertion_index = 0; for (; insertion_index < number_of_transitions; ++insertion_index) { if (InsertionPointFound(GetKey(insertion_index), name)) break; - result->CopyFrom(this, insertion_index, insertion_index, witness); + result->NoIncrementalWriteBarrierCopyFrom( + this, insertion_index, insertion_index); } - result->Set(insertion_index, name, target, witness); + result->NoIncrementalWriteBarrierSet(insertion_index, name, target); for (; insertion_index < number_of_transitions; ++insertion_index) { - result->CopyFrom(this, insertion_index, insertion_index + 1, witness); + result->NoIncrementalWriteBarrierCopyFrom( + this, insertion_index, insertion_index + 1); } + result->set_back_pointer_storage(back_pointer_storage()); return result; } |