Index: src/objects-inl.h |
diff --git a/src/objects-inl.h b/src/objects-inl.h |
index a5b2b352d79174ac87f08b4f6bc2d6e5f349f3a9..41bf13e265cc22f3d39b99983bf85b405f5efa53 100644 |
--- a/src/objects-inl.h |
+++ b/src/objects-inl.h |
@@ -1877,41 +1877,6 @@ void JSObject::initialize_elements() { |
} |
-Handle<String> Map::ExpectedTransitionKey(Handle<Map> map) { |
- DisallowHeapAllocation no_gc; |
- if (!map->HasTransitionArray()) return Handle<String>::null(); |
- TransitionArray* transitions = map->transitions(); |
- if (!transitions->IsSimpleTransition()) return Handle<String>::null(); |
- int transition = TransitionArray::kSimpleTransitionIndex; |
- PropertyDetails details = transitions->GetTargetDetails(transition); |
- Name* name = transitions->GetKey(transition); |
- if (details.type() != DATA) return Handle<String>::null(); |
- if (details.attributes() != NONE) return Handle<String>::null(); |
- if (!name->IsString()) return Handle<String>::null(); |
- return Handle<String>(String::cast(name)); |
-} |
- |
- |
-Handle<Map> Map::ExpectedTransitionTarget(Handle<Map> map) { |
- DCHECK(!ExpectedTransitionKey(map).is_null()); |
- return Handle<Map>(map->transitions()->GetTarget( |
- TransitionArray::kSimpleTransitionIndex)); |
-} |
- |
- |
-Handle<Map> Map::FindTransitionToField(Handle<Map> map, Handle<Name> key) { |
- DisallowHeapAllocation no_allocation; |
- if (!map->HasTransitionArray()) return Handle<Map>::null(); |
- TransitionArray* transitions = map->transitions(); |
- int transition = transitions->Search(kData, *key, NONE); |
- if (transition == TransitionArray::kNotFound) return Handle<Map>::null(); |
- PropertyDetails details = transitions->GetTargetDetails(transition); |
- if (details.type() != DATA) return Handle<Map>::null(); |
- DCHECK_EQ(NONE, details.attributes()); |
- return Handle<Map>(transitions->GetTarget(transition)); |
-} |
- |
- |
ACCESSORS(Oddball, to_string, String, kToStringOffset) |
ACCESSORS(Oddball, to_number, Object, kToNumberOffset) |
@@ -3037,7 +3002,7 @@ FixedArrayBase* Map::GetInitialElements() { |
return empty_array; |
} else if (has_fixed_typed_array_elements()) { |
FixedTypedArrayBase* empty_array = |
- GetHeap()->EmptyFixedTypedArrayForMap(this); |
+ GetHeap()->EmptyFixedTypedArrayForMap(this); |
DCHECK(!GetHeap()->InNewSpace(empty_array)); |
return empty_array; |
} else { |
@@ -5255,22 +5220,6 @@ void Map::set_prototype(Object* value, WriteBarrierMode mode) { |
} |
-// If the descriptor is using the empty transition array, install a new empty |
-// transition array that will have place for an element transition. |
-static void EnsureHasTransitionArray(Handle<Map> map) { |
- Handle<TransitionArray> transitions; |
- if (!map->HasTransitionArray()) { |
- transitions = TransitionArray::Allocate(map->GetIsolate(), 0); |
- transitions->set_back_pointer_storage(map->GetBackPointer()); |
- } else if (!map->transitions()->IsFullTransitionArray()) { |
- transitions = TransitionArray::ExtendToFullTransitionArray(map); |
- } else { |
- return; |
- } |
- map->set_transitions(*transitions); |
-} |
- |
- |
LayoutDescriptor* Map::layout_descriptor_gc_safe() { |
Object* layout_desc = READ_FIELD(this, kLayoutDecriptorOffset); |
return LayoutDescriptor::cast_gc_safe(layout_desc); |
@@ -5373,127 +5322,13 @@ Object* Map::GetBackPointer() { |
} |
-bool Map::HasElementsTransition() { |
- return HasTransitionArray() && transitions()->HasElementsTransition(); |
-} |
- |
- |
-bool Map::HasTransitionArray() const { |
- Object* object = READ_FIELD(this, kTransitionsOffset); |
- return object->IsTransitionArray(); |
-} |
- |
- |
-Map* Map::elements_transition_map() { |
- int index = |
- transitions()->SearchSpecial(GetHeap()->elements_transition_symbol()); |
- return transitions()->GetTarget(index); |
+Map* Map::ElementsTransitionMap() { |
+ return TransitionArray::SearchSpecial( |
+ this, GetHeap()->elements_transition_symbol()); |
} |
-bool Map::CanHaveMoreTransitions() { |
- if (!HasTransitionArray()) return true; |
- return transitions()->number_of_transitions() < |
- TransitionArray::kMaxNumberOfTransitions; |
-} |
- |
- |
-Map* Map::GetTransition(int transition_index) { |
- return transitions()->GetTarget(transition_index); |
-} |
- |
- |
-int Map::SearchSpecialTransition(Symbol* name) { |
- if (HasTransitionArray()) { |
- return transitions()->SearchSpecial(name); |
- } |
- return TransitionArray::kNotFound; |
-} |
- |
- |
-int Map::SearchTransition(PropertyKind kind, Name* name, |
- PropertyAttributes attributes) { |
- if (HasTransitionArray()) { |
- return transitions()->Search(kind, name, attributes); |
- } |
- return TransitionArray::kNotFound; |
-} |
- |
- |
-FixedArray* Map::GetPrototypeTransitions() { |
- if (!HasTransitionArray()) return GetHeap()->empty_fixed_array(); |
- if (!transitions()->HasPrototypeTransitions()) { |
- return GetHeap()->empty_fixed_array(); |
- } |
- return transitions()->GetPrototypeTransitions(); |
-} |
- |
- |
-void Map::SetPrototypeTransitions( |
- Handle<Map> map, Handle<FixedArray> proto_transitions) { |
- EnsureHasTransitionArray(map); |
- int old_number_of_transitions = map->NumberOfProtoTransitions(); |
- if (Heap::ShouldZapGarbage() && map->HasPrototypeTransitions()) { |
- DCHECK(map->GetPrototypeTransitions() != *proto_transitions); |
- map->ZapPrototypeTransitions(); |
- } |
- map->transitions()->SetPrototypeTransitions(*proto_transitions); |
- map->SetNumberOfProtoTransitions(old_number_of_transitions); |
-} |
- |
- |
-bool Map::HasPrototypeTransitions() { |
- return HasTransitionArray() && transitions()->HasPrototypeTransitions(); |
-} |
- |
- |
-TransitionArray* Map::transitions() const { |
- DCHECK(HasTransitionArray()); |
- Object* object = READ_FIELD(this, kTransitionsOffset); |
- return TransitionArray::cast(object); |
-} |
- |
- |
-void Map::set_transitions(TransitionArray* transition_array, |
- WriteBarrierMode mode) { |
- // Transition arrays are not shared. When one is replaced, it should not |
- // keep referenced objects alive, so we zap it. |
- // When there is another reference to the array somewhere (e.g. a handle), |
- // not zapping turns from a waste of memory into a source of crashes. |
- if (HasTransitionArray()) { |
-#ifdef DEBUG |
- for (int i = 0; i < transitions()->number_of_transitions(); i++) { |
- Map* target = transitions()->GetTarget(i); |
- if (target->instance_descriptors() == instance_descriptors()) { |
- Name* key = transitions()->GetKey(i); |
- int new_target_index; |
- if (TransitionArray::IsSpecialTransition(key)) { |
- new_target_index = transition_array->SearchSpecial(Symbol::cast(key)); |
- } else { |
- PropertyDetails details = |
- TransitionArray::GetTargetDetails(key, target); |
- new_target_index = transition_array->Search(details.kind(), key, |
- details.attributes()); |
- } |
- DCHECK_NE(TransitionArray::kNotFound, new_target_index); |
- DCHECK_EQ(target, transition_array->GetTarget(new_target_index)); |
- } |
- } |
-#endif |
- DCHECK(transitions() != transition_array); |
- ZapTransitions(); |
- } |
- |
- WRITE_FIELD(this, kTransitionsOffset, transition_array); |
- CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kTransitionsOffset, |
- transition_array, mode); |
-} |
- |
- |
-void Map::init_transitions(Object* undefined) { |
- DCHECK(undefined->IsUndefined()); |
- WRITE_FIELD(this, kTransitionsOffset, undefined); |
-} |
+ACCESSORS(Map, raw_transitions, Object, kTransitionsOffset) |
void Map::SetBackPointer(Object* value, WriteBarrierMode mode) { |
@@ -5512,6 +5347,7 @@ ACCESSORS(Map, weak_cell_cache, Object, kWeakCellCacheOffset) |
ACCESSORS(Map, constructor_or_backpointer, Object, |
kConstructorOrBackPointerOffset) |
+ |
Object* Map::GetConstructor() const { |
Object* maybe_constructor = constructor_or_backpointer(); |
// Follow any back pointers. |
@@ -5521,12 +5357,15 @@ Object* Map::GetConstructor() const { |
} |
return maybe_constructor; |
} |
+ |
+ |
void Map::SetConstructor(Object* constructor, WriteBarrierMode mode) { |
// Never overwrite a back pointer with a constructor. |
DCHECK(!constructor_or_backpointer()->IsMap()); |
set_constructor_or_backpointer(constructor, mode); |
} |
+ |
ACCESSORS(JSFunction, shared, SharedFunctionInfo, kSharedFunctionInfoOffset) |
ACCESSORS(JSFunction, literals_or_bindings, FixedArray, kLiteralsOffset) |
ACCESSORS(JSFunction, next_function_link, Object, kNextFunctionLinkOffset) |