diff --git a/src/hydrogen.cc b/src/hydrogen.cc index 500e38f8da..a50361c258 100644 --- a/src/hydrogen.cc +++ b/src/hydrogen.cc @@ -4095,21 +4095,21 @@ HValue* HGraphBuilder::HandlePolymorphicElementAccess(HValue* object, } // Elements_kind transition support. - MapList transition_target(maps->length()); + MapHandleList transition_target(maps->length()); // Collect possible transition targets. - MapList possible_transitioned_maps(maps->length()); + MapHandleList possible_transitioned_maps(maps->length()); for (int i = 0; i < maps->length(); ++i) { Handle map = maps->at(i); ElementsKind elements_kind = map->elements_kind(); if (elements_kind == FAST_DOUBLE_ELEMENTS || elements_kind == FAST_ELEMENTS) { - possible_transitioned_maps.Add(*map); + possible_transitioned_maps.Add(map); } } // Get transition target for each map (NULL == no transition). for (int i = 0; i < maps->length(); ++i) { Handle map = maps->at(i); - Map* transitioned_map = + Handle transitioned_map = map->FindTransitionedMap(&possible_transitioned_maps); transition_target.Add(transitioned_map); } @@ -4119,9 +4119,9 @@ HValue* HGraphBuilder::HandlePolymorphicElementAccess(HValue* object, for (int i = 0; i < maps->length(); ++i) { Handle map = maps->at(i); ASSERT(map->IsMap()); - if (transition_target.at(i) != NULL) { + if (!transition_target.at(i).is_null()) { object = AddInstruction(new(zone()) HTransitionElementsKind( - object, map, Handle(transition_target.at(i)))); + object, map, transition_target.at(i))); } else { type_todo[map->elements_kind()] = true; if (map->elements_kind() >= FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND) { diff --git a/src/objects.cc b/src/objects.cc index b307930621..e1cae4641d 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -2181,47 +2181,51 @@ void Map::LookupInDescriptors(JSObject* holder, } -// If |map| is contained in |maps_list|, returns |map|; otherwise returns NULL. -static bool ContainsMap(MapList* maps_list, Map* map) { - for (int i = 0; i < maps_list->length(); ++i) { - if (maps_list->at(i) == map) return true; +static bool ContainsMap(MapHandleList* maps, Handle map) { + ASSERT(!map.is_null()); + for (int i = 0; i < maps->length(); ++i) { + if (!maps->at(i).is_null() && maps->at(i).is_identical_to(map)) return true; } return false; } -Handle Map::FindTransitionedMap(MapHandleList* candidates) { - MapList raw_candidates(candidates->length()); - Map* result = FindTransitionedMap(UnwrapHandleList(&raw_candidates, - candidates)); - return (result == NULL) ? Handle::null() : Handle(result); +template +static Handle MaybeNull(T* p) { + if (p == NULL) return Handle::null(); + return Handle(p); } -Map* Map::FindTransitionedMap(MapList* candidates) { +Handle Map::FindTransitionedMap(MapHandleList* candidates) { ElementsKind elms_kind = elements_kind(); if (elms_kind == FAST_DOUBLE_ELEMENTS) { bool dummy = true; - Map* fast_map = LookupElementsTransitionMap(FAST_ELEMENTS, &dummy); - if (fast_map == NULL) return NULL; - if (ContainsMap(candidates, fast_map)) return fast_map; - return NULL; + Handle fast_map = + MaybeNull(LookupElementsTransitionMap(FAST_ELEMENTS, &dummy)); + if (!fast_map.is_null() && ContainsMap(candidates, fast_map)) { + return fast_map; + } + return Handle::null(); } if (elms_kind == FAST_SMI_ONLY_ELEMENTS) { bool dummy = true; - Map* double_map = LookupElementsTransitionMap(FAST_DOUBLE_ELEMENTS, &dummy); + Handle double_map = + MaybeNull(LookupElementsTransitionMap(FAST_DOUBLE_ELEMENTS, &dummy)); // In the current implementation, if the DOUBLE map doesn't exist, the // FAST map can't exist either. - if (double_map == NULL) return NULL; - Map* fast_map = double_map->LookupElementsTransitionMap(FAST_ELEMENTS, - &dummy); - if (fast_map != NULL && ContainsMap(candidates, fast_map)) return fast_map; + if (double_map.is_null()) return Handle::null(); + Handle fast_map = + MaybeNull(double_map->LookupElementsTransitionMap(FAST_ELEMENTS, + &dummy)); + if (!fast_map.is_null() && ContainsMap(candidates, fast_map)) { + return fast_map; + } if (ContainsMap(candidates, double_map)) return double_map; } - return NULL; + return Handle::null(); } - static Map* GetElementsTransitionMapFromDescriptor(Object* descriptor_contents, ElementsKind elements_kind) { if (descriptor_contents->IsMap()) {