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