| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 8db40f098b7cd1ef6e43ec2e014538fb4aa762b6..11e2d4de606825898dffeb8b556f3d78c53cb437 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> 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> Map::FindTransitionedMap(MapHandleList* candidates) {
|
| - MapList raw_candidates(candidates->length());
|
| - Map* result = FindTransitionedMap(UnwrapHandleList(&raw_candidates,
|
| - candidates));
|
| - return (result == NULL) ? Handle<Map>::null() : Handle<Map>(result);
|
| +template <class T>
|
| +static Handle<T> MaybeNull(T* p) {
|
| + if (p == NULL) return Handle<T>::null();
|
| + return Handle<T>(p);
|
| }
|
|
|
|
|
| -Map* Map::FindTransitionedMap(MapList* candidates) {
|
| +Handle<Map> 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<Map> fast_map =
|
| + MaybeNull(LookupElementsTransitionMap(FAST_ELEMENTS, &dummy));
|
| + if (!fast_map.is_null() && ContainsMap(candidates, fast_map)) {
|
| + return fast_map;
|
| + }
|
| + return Handle<Map>::null();
|
| }
|
| if (elms_kind == FAST_SMI_ONLY_ELEMENTS) {
|
| bool dummy = true;
|
| - Map* double_map = LookupElementsTransitionMap(FAST_DOUBLE_ELEMENTS, &dummy);
|
| + Handle<Map> 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<Map>::null();
|
| + Handle<Map> 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<Map>::null();
|
| }
|
|
|
| -
|
| static Map* GetElementsTransitionMapFromDescriptor(Object* descriptor_contents,
|
| ElementsKind elements_kind) {
|
| if (descriptor_contents->IsMap()) {
|
|
|