diff options
Diffstat (limited to 'deps/v8/src/transitions-inl.h')
-rw-r--r-- | deps/v8/src/transitions-inl.h | 117 |
1 files changed, 26 insertions, 91 deletions
diff --git a/deps/v8/src/transitions-inl.h b/deps/v8/src/transitions-inl.h index fd8eb8b0b6..f31eff96ba 100644 --- a/deps/v8/src/transitions-inl.h +++ b/deps/v8/src/transitions-inl.h @@ -11,55 +11,19 @@ namespace v8 { namespace internal { -#define FIELD_ADDR(p, offset) \ - (reinterpret_cast<byte*>(p) + offset - kHeapObjectTag) - -#define WRITE_FIELD(p, offset, value) \ - (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset)) = value) - -#define CONDITIONAL_WRITE_BARRIER(heap, object, offset, value, mode) \ - if (mode == UPDATE_WRITE_BARRIER) { \ - heap->incremental_marking()->RecordWrite( \ - object, HeapObject::RawField(object, offset), value); \ - if (heap->InNewSpace(value)) { \ - heap->RecordWrite(object->address(), offset); \ - } \ - } - - TransitionArray* TransitionArray::cast(Object* object) { DCHECK(object->IsTransitionArray()); return reinterpret_cast<TransitionArray*>(object); } -bool TransitionArray::HasElementsTransition() { - return SearchSpecial(GetHeap()->elements_transition_symbol()) != kNotFound; -} - - -Object* TransitionArray::back_pointer_storage() { - return get(kBackPointerStorageIndex); -} - - -void TransitionArray::set_back_pointer_storage(Object* back_pointer, - WriteBarrierMode mode) { - Heap* heap = GetHeap(); - WRITE_FIELD(this, kBackPointerStorageOffset, back_pointer); - CONDITIONAL_WRITE_BARRIER( - heap, this, kBackPointerStorageOffset, back_pointer, mode); -} - - bool TransitionArray::HasPrototypeTransitions() { - return IsFullTransitionArray() && - get(kPrototypeTransitionsIndex) != Smi::FromInt(0); + return get(kPrototypeTransitionsIndex) != Smi::FromInt(0); } FixedArray* TransitionArray::GetPrototypeTransitions() { - DCHECK(IsFullTransitionArray()); + DCHECK(HasPrototypeTransitions()); // Callers must check first. Object* prototype_transitions = get(kPrototypeTransitionsIndex); return FixedArray::cast(prototype_transitions); } @@ -67,88 +31,68 @@ FixedArray* TransitionArray::GetPrototypeTransitions() { void TransitionArray::SetPrototypeTransitions(FixedArray* transitions, WriteBarrierMode mode) { - DCHECK(IsFullTransitionArray()); DCHECK(transitions->IsFixedArray()); - Heap* heap = GetHeap(); - WRITE_FIELD(this, kPrototypeTransitionsOffset, transitions); - CONDITIONAL_WRITE_BARRIER( - heap, this, kPrototypeTransitionsOffset, transitions, mode); + set(kPrototypeTransitionsIndex, transitions, mode); } Object** TransitionArray::GetPrototypeTransitionsSlot() { - return HeapObject::RawField(reinterpret_cast<HeapObject*>(this), - kPrototypeTransitionsOffset); + return RawFieldOfElementAt(kPrototypeTransitionsIndex); } Object** TransitionArray::GetKeySlot(int transition_number) { - DCHECK(!IsSimpleTransition()); DCHECK(transition_number < number_of_transitions()); return RawFieldOfElementAt(ToKeyIndex(transition_number)); } Name* TransitionArray::GetKey(int transition_number) { - if (IsSimpleTransition()) { - Map* target = GetTarget(kSimpleTransitionIndex); - int descriptor = target->LastAdded(); - Name* key = target->instance_descriptors()->GetKey(descriptor); - return key; - } DCHECK(transition_number < number_of_transitions()); return Name::cast(get(ToKeyIndex(transition_number))); } +Name* TransitionArray::GetKey(Object* raw_transitions, int transition_number) { + if (IsSimpleTransition(raw_transitions)) { + DCHECK(transition_number == 0); + return GetSimpleTransitionKey(GetSimpleTransition(raw_transitions)); + } + DCHECK(IsFullTransitionArray(raw_transitions)); + return TransitionArray::cast(raw_transitions)->GetKey(transition_number); +} + + void TransitionArray::SetKey(int transition_number, Name* key) { - DCHECK(!IsSimpleTransition()); DCHECK(transition_number < number_of_transitions()); set(ToKeyIndex(transition_number), key); } Map* TransitionArray::GetTarget(int transition_number) { - if (IsSimpleTransition()) { - DCHECK(transition_number == kSimpleTransitionIndex); - return Map::cast(get(kSimpleTransitionTarget)); - } DCHECK(transition_number < number_of_transitions()); return Map::cast(get(ToTargetIndex(transition_number))); } -void TransitionArray::SetTarget(int transition_number, Map* value) { - if (IsSimpleTransition()) { - DCHECK(transition_number == kSimpleTransitionIndex); - return set(kSimpleTransitionTarget, value); +Map* TransitionArray::GetTarget(Object* raw_transitions, + int transition_number) { + if (IsSimpleTransition(raw_transitions)) { + DCHECK(transition_number == 0); + return GetSimpleTransition(raw_transitions); } - DCHECK(transition_number < number_of_transitions()); - set(ToTargetIndex(transition_number), value); -} - - -PropertyDetails TransitionArray::GetTargetDetails(int transition_number) { - Map* map = GetTarget(transition_number); - return map->GetLastDescriptorDetails(); + DCHECK(IsFullTransitionArray(raw_transitions)); + return TransitionArray::cast(raw_transitions)->GetTarget(transition_number); } -Object* TransitionArray::GetTargetValue(int transition_number) { - Map* map = GetTarget(transition_number); - return map->instance_descriptors()->GetValue(map->LastAdded()); +void TransitionArray::SetTarget(int transition_number, Map* value) { + DCHECK(transition_number < number_of_transitions()); + set(ToTargetIndex(transition_number), value); } int TransitionArray::SearchName(Name* name, int* out_insertion_index) { - if (IsSimpleTransition()) { - Name* key = GetKey(kSimpleTransitionIndex); - if (key->Equals(name)) return kSimpleTransitionIndex; - if (out_insertion_index != NULL) { - *out_insertion_index = key->Hash() > name->Hash() ? 0 : 1; - } - return kNotFound; - } return internal::Search<ALL_ENTRIES>(this, name, 0, out_insertion_index); } @@ -225,19 +169,10 @@ void TransitionArray::NoIncrementalWriteBarrierSet(int transition_number, void TransitionArray::SetNumberOfTransitions(int number_of_transitions) { - if (IsFullTransitionArray()) { - DCHECK(number_of_transitions <= number_of_transitions_storage()); - WRITE_FIELD(this, kTransitionLengthOffset, - Smi::FromInt(number_of_transitions)); - } + DCHECK(number_of_transitions <= Capacity(this)); + set(kTransitionLengthIndex, Smi::FromInt(number_of_transitions)); } - -#undef FIELD_ADDR -#undef WRITE_FIELD -#undef CONDITIONAL_WRITE_BARRIER - - } } // namespace v8::internal #endif // V8_TRANSITIONS_INL_H_ |