Index: src/objects-debug.cc |
diff --git a/src/objects-debug.cc b/src/objects-debug.cc |
index 74c015be1bdf5a4fa098f87296590a3fda92f69a..5140f81bf0d18c8d43601dfad462b8358667347d 100644 |
--- a/src/objects-debug.cc |
+++ b/src/objects-debug.cc |
@@ -303,7 +303,8 @@ void Map::MapVerify() { |
VerifyHeapPointer(prototype()); |
VerifyHeapPointer(instance_descriptors()); |
SLOW_ASSERT(instance_descriptors()->IsSortedNoDuplicates()); |
- SLOW_ASSERT(instance_descriptors()->IsConsistentWithBackPointers(this)); |
+ SLOW_ASSERT(transitions()->IsSortedNoDuplicates()); |
+ SLOW_ASSERT(transitions()->IsConsistentWithBackPointers(this)); |
} |
@@ -916,48 +917,45 @@ bool DescriptorArray::IsSortedNoDuplicates() { |
} |
+bool TransitionArray::IsSortedNoDuplicates() { |
+ if (!IsTransitionArray()) return true; |
Michael Starzinger
2012/06/28 16:02:12
Can this really happen? If not, drop this line.
Toon Verwaest
2012/06/29 08:14:55
Done.
|
+ 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)) { |
- 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; |
+bool TransitionArray::IsConsistentWithBackPointers(Map* current_map) { |
+ if (this == NULL) return true; |
Michael Starzinger
2012/06/28 16:02:12
Can "this" really be NULL? If not, drop this line.
Toon Verwaest
2012/06/29 08:14:55
Done.
|
+ if (!CheckOneBackPointer(current_map, elements())) return false; |
+ 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; |
+ continue; |
Michael Starzinger
2012/06/28 16:02:12
Drop the continue.
Toon Verwaest
2012/06/29 08:14:55
Done.
|
} |
+ if (!CheckOneBackPointer(current_map, value)) return false; |
Michael Starzinger
2012/06/28 16:02:12
Can we turn this into a proper "else" branch and a
Toon Verwaest
2012/06/29 08:14:55
Done.
|
} |
return true; |
} |
@@ -1004,12 +1002,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()); |
} |