| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index baba61a9fb384d158b3b271c2bcd93c847b72184..efd0777f790bdcccac122f5c31e36c6b97485420 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -2163,15 +2163,16 @@ static MaybeObject* AddElementsTransitionMapToDescriptor(
|
| }
|
|
|
|
|
| -// Returns the contents of |map|'s descriptor array for the given string
|
| -// (which might be NULL). |safe_to_add_transition| is set to false and NULL
|
| -// is returned if adding transitions is not allowed.
|
| -static Object* GetDescriptorContents(Map* map,
|
| - String* sentinel_name,
|
| - bool* safe_to_add_transition) {
|
| +String* Map::elements_transition_sentinel_name() {
|
| + return GetHeap()->empty_symbol();
|
| +}
|
| +
|
| +
|
| +Object* Map::GetDescriptorContents(String* sentinel_name,
|
| + bool* safe_to_add_transition) {
|
| // Get the cached index for the descriptors lookup, or find and cache it.
|
| - DescriptorArray* descriptors = map->instance_descriptors();
|
| - DescriptorLookupCache* cache = map->GetIsolate()->descriptor_lookup_cache();
|
| + DescriptorArray* descriptors = instance_descriptors();
|
| + DescriptorLookupCache* cache = GetIsolate()->descriptor_lookup_cache();
|
| int index = cache->Lookup(descriptors, sentinel_name);
|
| if (index == DescriptorLookupCache::kAbsent) {
|
| index = descriptors->Search(sentinel_name);
|
| @@ -2190,31 +2191,20 @@ static Object* GetDescriptorContents(Map* map,
|
| }
|
|
|
|
|
| -// Returns the map that |original_map| transitions to if its elements_kind
|
| -// is changed to |elements_kind|, or NULL if no such map is cached yet.
|
| -// |safe_to_add_transitions| is set to false if adding transitions is not
|
| -// allowed.
|
| -static Map* LookupElementsTransitionMap(Map* original_map,
|
| - ElementsKind elements_kind,
|
| - String* sentinel_name,
|
| - bool* safe_to_add_transition) {
|
| +Map* Map::LookupElementsTransitionMap(ElementsKind elements_kind,
|
| + bool* safe_to_add_transition) {
|
| // Special case: indirect SMI->FAST transition (cf. comment in
|
| // AddElementsTransition()).
|
| - if (original_map->elements_kind() == FAST_SMI_ONLY_ELEMENTS &&
|
| + if (this->elements_kind() == FAST_SMI_ONLY_ELEMENTS &&
|
| elements_kind == FAST_ELEMENTS) {
|
| - Map* double_map = LookupElementsTransitionMap(
|
| - original_map,
|
| - FAST_DOUBLE_ELEMENTS,
|
| - sentinel_name,
|
| - safe_to_add_transition);
|
| + Map* double_map = this->LookupElementsTransitionMap(FAST_DOUBLE_ELEMENTS,
|
| + safe_to_add_transition);
|
| if (double_map == NULL) return double_map;
|
| - return LookupElementsTransitionMap(double_map,
|
| - FAST_ELEMENTS,
|
| - sentinel_name,
|
| - safe_to_add_transition);
|
| + return double_map->LookupElementsTransitionMap(FAST_ELEMENTS,
|
| + safe_to_add_transition);
|
| }
|
| Object* descriptor_contents = GetDescriptorContents(
|
| - original_map, sentinel_name, safe_to_add_transition);
|
| + elements_transition_sentinel_name(), safe_to_add_transition);
|
| if (descriptor_contents != NULL) {
|
| Map* maybe_transition_map =
|
| GetElementsTransitionMapFromDescriptor(descriptor_contents,
|
| @@ -2226,41 +2216,34 @@ static Map* LookupElementsTransitionMap(Map* original_map,
|
| }
|
|
|
|
|
| -// Adds an entry to |original_map|'s descriptor array for a transition to
|
| -// |transitioned_map| when its elements_kind is changed to |elements_kind|,
|
| -// using |sentinel_name| as key for the entry.
|
| -static MaybeObject* AddElementsTransition(Map* original_map,
|
| - ElementsKind elements_kind,
|
| - Map* transitioned_map,
|
| - String* sentinel_name) {
|
| +MaybeObject* Map::AddElementsTransition(ElementsKind elements_kind,
|
| + Map* transitioned_map) {
|
| // The map transition graph should be a tree, therefore the transition
|
| // from SMI to FAST elements is not done directly, but by going through
|
| // DOUBLE elements first.
|
| - if (original_map->elements_kind() == FAST_SMI_ONLY_ELEMENTS &&
|
| + if (this->elements_kind() == FAST_SMI_ONLY_ELEMENTS &&
|
| elements_kind == FAST_ELEMENTS) {
|
| bool safe_to_add = true;
|
| - Map* double_map = LookupElementsTransitionMap(
|
| - original_map, FAST_DOUBLE_ELEMENTS, sentinel_name, &safe_to_add);
|
| + Map* double_map = this->LookupElementsTransitionMap(
|
| + FAST_DOUBLE_ELEMENTS, &safe_to_add);
|
| // This method is only called when safe_to_add_transition has been found
|
| // to be true earlier.
|
| ASSERT(safe_to_add);
|
|
|
| if (double_map == NULL) {
|
| - MaybeObject* maybe_map = original_map->CopyDropTransitions();
|
| + MaybeObject* maybe_map = this->CopyDropTransitions();
|
| if (!maybe_map->To(&double_map)) return maybe_map;
|
| double_map->set_elements_kind(FAST_DOUBLE_ELEMENTS);
|
| - MaybeObject* maybe_double_transition = AddElementsTransition(
|
| - original_map, FAST_DOUBLE_ELEMENTS, double_map, sentinel_name);
|
| + MaybeObject* maybe_double_transition = this->AddElementsTransition(
|
| + FAST_DOUBLE_ELEMENTS, double_map);
|
| if (maybe_double_transition->IsFailure()) return maybe_double_transition;
|
| }
|
| - return AddElementsTransition(
|
| - double_map, FAST_ELEMENTS, transitioned_map, sentinel_name);
|
| + return double_map->AddElementsTransition(FAST_ELEMENTS, transitioned_map);
|
| }
|
|
|
| - DescriptorArray* descriptors = original_map->instance_descriptors();
|
| bool safe_to_add_transition = true;
|
| Object* descriptor_contents = GetDescriptorContents(
|
| - original_map, sentinel_name, &safe_to_add_transition);
|
| + elements_transition_sentinel_name(), &safe_to_add_transition);
|
| // This method is only called when safe_to_add_transition has been found
|
| // to be true earlier.
|
| ASSERT(safe_to_add_transition);
|
| @@ -2272,24 +2255,22 @@ static MaybeObject* AddElementsTransition(Map* original_map,
|
| return maybe_new_contents;
|
| }
|
|
|
| - ElementsTransitionDescriptor desc(sentinel_name, new_contents);
|
| + ElementsTransitionDescriptor desc(elements_transition_sentinel_name(),
|
| + new_contents);
|
| Object* new_descriptors;
|
| MaybeObject* maybe_new_descriptors =
|
| - descriptors->CopyInsert(&desc, KEEP_TRANSITIONS);
|
| + instance_descriptors()->CopyInsert(&desc, KEEP_TRANSITIONS);
|
| if (!maybe_new_descriptors->ToObject(&new_descriptors)) {
|
| return maybe_new_descriptors;
|
| }
|
| - descriptors = DescriptorArray::cast(new_descriptors);
|
| - original_map->set_instance_descriptors(descriptors);
|
| - return original_map;
|
| + set_instance_descriptors(DescriptorArray::cast(new_descriptors));
|
| + return this;
|
| }
|
|
|
|
|
| MaybeObject* JSObject::GetElementsTransitionMap(ElementsKind to_kind) {
|
| - Heap* current_heap = GetHeap();
|
| Map* current_map = map();
|
| ElementsKind from_kind = current_map->elements_kind();
|
| - String* elements_transition_sentinel_name = current_heap->empty_symbol();
|
|
|
| if (from_kind == to_kind) return current_map;
|
|
|
| @@ -2309,9 +2290,8 @@ MaybeObject* JSObject::GetElementsTransitionMap(ElementsKind to_kind) {
|
| if (safe_to_add_transition) {
|
| // It's only safe to manipulate the descriptor array if it would be
|
| // safe to add a transition.
|
| - Map* maybe_transition_map = LookupElementsTransitionMap(
|
| - current_map, to_kind, elements_transition_sentinel_name,
|
| - &safe_to_add_transition);
|
| + Map* maybe_transition_map = current_map->LookupElementsTransitionMap(
|
| + to_kind, &safe_to_add_transition);
|
| if (maybe_transition_map != NULL) {
|
| return maybe_transition_map;
|
| }
|
| @@ -2334,8 +2314,8 @@ MaybeObject* JSObject::GetElementsTransitionMap(ElementsKind to_kind) {
|
| (GetIsolate()->context()->global_context()->object_function()->map() !=
|
| map());
|
| if (allow_map_transition) {
|
| - MaybeObject* maybe_transition = AddElementsTransition(
|
| - current_map, to_kind, new_map, elements_transition_sentinel_name);
|
| + MaybeObject* maybe_transition =
|
| + current_map->AddElementsTransition(to_kind, new_map);
|
| if (maybe_transition->IsFailure()) return maybe_transition;
|
| }
|
| return new_map;
|
|
|