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()); |
} |