| Index: src/objects-debug.cc | 
| diff --git a/src/objects-debug.cc b/src/objects-debug.cc | 
| index 74c015be1bdf5a4fa098f87296590a3fda92f69a..6d54d3a4ed182fd036843456d092bd72a033637f 100644 | 
| --- a/src/objects-debug.cc | 
| +++ b/src/objects-debug.cc | 
| @@ -303,7 +303,10 @@ void Map::MapVerify() { | 
| VerifyHeapPointer(prototype()); | 
| VerifyHeapPointer(instance_descriptors()); | 
| SLOW_ASSERT(instance_descriptors()->IsSortedNoDuplicates()); | 
| -  SLOW_ASSERT(instance_descriptors()->IsConsistentWithBackPointers(this)); | 
| +  if (HasTransitionArray()) { | 
| +    SLOW_ASSERT(transitions()->IsSortedNoDuplicates()); | 
| +    SLOW_ASSERT(transitions()->IsConsistentWithBackPointers(this)); | 
| +  } | 
| } | 
|  | 
|  | 
| @@ -916,47 +919,46 @@ bool DescriptorArray::IsSortedNoDuplicates() { | 
| } | 
|  | 
|  | 
| +bool TransitionArray::IsSortedNoDuplicates() { | 
| +  String* current_key = NULL; | 
| +  uint32_t current = 0; | 
| +  for (int i = 0; i < number_of_transitions(); i++) { | 
| +    String* key = GetKey(i); | 
| +    if (key == current_key) { | 
| +      PrintTransitions(); | 
| +      return false; | 
| +    } | 
| +    current_key = key; | 
| +    uint32_t hash = GetKey(i)->Hash(); | 
| +    if (hash < current) { | 
| +      PrintTransitions(); | 
| +      return false; | 
| +    } | 
| +    current = hash; | 
| +  } | 
| +  return true; | 
| +} | 
| + | 
| + | 
| static bool CheckOneBackPointer(Map* current_map, Object* target) { | 
| return !target->IsMap() || Map::cast(target)->GetBackPointer() == current_map; | 
| } | 
|  | 
|  | 
| -bool DescriptorArray::IsConsistentWithBackPointers(Map* current_map) { | 
| -  Map* elements_transition = elements_transition_map(); | 
| -  if (elements_transition != NULL && | 
| -      !CheckOneBackPointer(current_map, elements_transition)) { | 
| +bool TransitionArray::IsConsistentWithBackPointers(Map* current_map) { | 
| +  if (HasElementsTransition() && | 
| +      !CheckOneBackPointer(current_map, elements_transition())) { | 
| return false; | 
| } | 
| -  for (int i = 0; i < number_of_descriptors(); ++i) { | 
| -    switch (GetType(i)) { | 
| -      case MAP_TRANSITION: | 
| -      case CONSTANT_TRANSITION: | 
| -        if (!CheckOneBackPointer(current_map, GetValue(i))) { | 
| -          return false; | 
| -        } | 
| -        break; | 
| -      case CALLBACKS: { | 
| -        Object* object = GetValue(i); | 
| -        if (object->IsAccessorPair()) { | 
| -          AccessorPair* accessors = AccessorPair::cast(object); | 
| -          if (!CheckOneBackPointer(current_map, accessors->getter())) { | 
| -            return false; | 
| -          } | 
| -          if (!CheckOneBackPointer(current_map, accessors->setter())) { | 
| -            return false; | 
| -          } | 
| -        } | 
| -        break; | 
| -      } | 
| -      case NORMAL: | 
| -      case FIELD: | 
| -      case CONSTANT_FUNCTION: | 
| -      case HANDLER: | 
| -      case INTERCEPTOR: | 
| -        break; | 
| -      case NONEXISTENT: | 
| -        UNREACHABLE(); | 
| -        break; | 
| +  for (int i = 0; i < number_of_transitions(); ++i) { | 
| +    Object* value = GetValue(i); | 
| +    if (value->IsAccessorPair()) { | 
| +      AccessorPair* accessors = AccessorPair::cast(value); | 
| +      if (!CheckOneBackPointer(current_map, accessors->getter())) return false; | 
| +      if (!CheckOneBackPointer(current_map, accessors->setter())) return false; | 
| +    } else { | 
| +      ASSERT(value->IsMap()); | 
| +      if (!CheckOneBackPointer(current_map, value)) return false; | 
| } | 
| } | 
| return true; | 
| @@ -1004,12 +1006,12 @@ void NormalizedMapCache::NormalizedMapCacheVerify() { | 
| } | 
|  | 
|  | 
| -void Map::ZapInstanceDescriptors() { | 
| -  DescriptorArray* descriptors = instance_descriptors(); | 
| -  if (descriptors == GetHeap()->empty_descriptor_array()) return; | 
| -  MemsetPointer(descriptors->data_start(), | 
| +void Map::ZapTransitions() { | 
| +  TransitionArray* transition_array = transitions(); | 
| +  if (transition_array == NULL) return; | 
| +  MemsetPointer(transition_array->data_start(), | 
| GetHeap()->the_hole_value(), | 
| -                descriptors->length()); | 
| +                transition_array->length()); | 
| } | 
|  | 
|  | 
|  |