Index: src/transitions-inl.h |
diff --git a/src/transitions-inl.h b/src/transitions-inl.h |
index fd8eb8b0b652a463365591b3a0b7a9f00e3bb9a4..f31eff96ba19e6e8e1dca0f1a4b3ee0c7c654a53 100644 |
--- a/src/transitions-inl.h |
+++ b/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_ |