OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 23 matching lines...) Expand all Loading... |
34 #include "objects-visiting.h" | 34 #include "objects-visiting.h" |
35 | 35 |
36 namespace v8 { | 36 namespace v8 { |
37 namespace internal { | 37 namespace internal { |
38 | 38 |
39 #ifdef VERIFY_HEAP | 39 #ifdef VERIFY_HEAP |
40 | 40 |
41 void MaybeObject::Verify() { | 41 void MaybeObject::Verify() { |
42 Object* this_as_object; | 42 Object* this_as_object; |
43 if (ToObject(&this_as_object)) { | 43 if (ToObject(&this_as_object)) { |
44 if (this_as_object->IsSmi()) { | 44 this_as_object->ObjectVerify(); |
45 Smi::cast(this_as_object)->SmiVerify(); | |
46 } else { | |
47 HeapObject::cast(this_as_object)->HeapObjectVerify(); | |
48 } | |
49 } else { | 45 } else { |
50 Failure::cast(this)->FailureVerify(); | 46 Failure::cast(this)->FailureVerify(); |
51 } | 47 } |
52 } | 48 } |
53 | 49 |
54 | 50 |
| 51 void Object::ObjectVerify() { |
| 52 if (IsSmi()) { |
| 53 Smi::cast(this)->SmiVerify(); |
| 54 } else { |
| 55 HeapObject::cast(this)->HeapObjectVerify(); |
| 56 } |
| 57 } |
| 58 |
| 59 |
55 void Object::VerifyPointer(Object* p) { | 60 void Object::VerifyPointer(Object* p) { |
56 if (p->IsHeapObject()) { | 61 if (p->IsHeapObject()) { |
57 HeapObject::VerifyHeapPointer(p); | 62 HeapObject::VerifyHeapPointer(p); |
58 } else { | 63 } else { |
59 CHECK(p->IsSmi()); | 64 CHECK(p->IsSmi()); |
60 } | 65 } |
61 } | 66 } |
62 | 67 |
63 | 68 |
64 void Smi::SmiVerify() { | 69 void Smi::SmiVerify() { |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
373 | 378 |
374 | 379 |
375 void AliasedArgumentsEntry::AliasedArgumentsEntryVerify() { | 380 void AliasedArgumentsEntry::AliasedArgumentsEntryVerify() { |
376 VerifySmiField(kAliasedContextSlot); | 381 VerifySmiField(kAliasedContextSlot); |
377 } | 382 } |
378 | 383 |
379 | 384 |
380 void FixedArray::FixedArrayVerify() { | 385 void FixedArray::FixedArrayVerify() { |
381 for (int i = 0; i < length(); i++) { | 386 for (int i = 0; i < length(); i++) { |
382 Object* e = get(i); | 387 Object* e = get(i); |
383 if (e->IsHeapObject()) { | 388 VerifyPointer(e); |
384 VerifyHeapPointer(e); | |
385 } else { | |
386 e->Verify(); | |
387 } | |
388 } | 389 } |
389 } | 390 } |
390 | 391 |
391 | 392 |
392 void FixedDoubleArray::FixedDoubleArrayVerify() { | 393 void FixedDoubleArray::FixedDoubleArrayVerify() { |
393 for (int i = 0; i < length(); i++) { | 394 for (int i = 0; i < length(); i++) { |
394 if (!is_the_hole(i)) { | 395 if (!is_the_hole(i)) { |
395 double value = get_scalar(i); | 396 double value = get_scalar(i); |
396 CHECK(!std::isnan(value) || | 397 CHECK(!std::isnan(value) || |
397 (BitCast<uint64_t>(value) == | 398 (BitCast<uint64_t>(value) == |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
619 void PropertyCell::PropertyCellVerify() { | 620 void PropertyCell::PropertyCellVerify() { |
620 CHECK(IsPropertyCell()); | 621 CHECK(IsPropertyCell()); |
621 VerifyObjectField(kValueOffset); | 622 VerifyObjectField(kValueOffset); |
622 VerifyObjectField(kTypeOffset); | 623 VerifyObjectField(kTypeOffset); |
623 } | 624 } |
624 | 625 |
625 | 626 |
626 void Code::CodeVerify() { | 627 void Code::CodeVerify() { |
627 CHECK(IsAligned(reinterpret_cast<intptr_t>(instruction_start()), | 628 CHECK(IsAligned(reinterpret_cast<intptr_t>(instruction_start()), |
628 kCodeAlignment)); | 629 kCodeAlignment)); |
629 relocation_info()->Verify(); | 630 relocation_info()->ObjectVerify(); |
630 Address last_gc_pc = NULL; | 631 Address last_gc_pc = NULL; |
631 for (RelocIterator it(this); !it.done(); it.next()) { | 632 for (RelocIterator it(this); !it.done(); it.next()) { |
632 it.rinfo()->Verify(); | 633 it.rinfo()->Verify(); |
633 // Ensure that GC will not iterate twice over the same pointer. | 634 // Ensure that GC will not iterate twice over the same pointer. |
634 if (RelocInfo::IsGCRelocMode(it.rinfo()->rmode())) { | 635 if (RelocInfo::IsGCRelocMode(it.rinfo()->rmode())) { |
635 CHECK(it.rinfo()->pc() != last_gc_pc); | 636 CHECK(it.rinfo()->pc() != last_gc_pc); |
636 last_gc_pc = it.rinfo()->pc(); | 637 last_gc_pc = it.rinfo()->pc(); |
637 } | 638 } |
638 } | 639 } |
639 } | 640 } |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
804 } | 805 } |
805 | 806 |
806 | 807 |
807 void Foreign::ForeignVerify() { | 808 void Foreign::ForeignVerify() { |
808 CHECK(IsForeign()); | 809 CHECK(IsForeign()); |
809 } | 810 } |
810 | 811 |
811 | 812 |
812 void Box::BoxVerify() { | 813 void Box::BoxVerify() { |
813 CHECK(IsBox()); | 814 CHECK(IsBox()); |
814 value()->Verify(); | 815 value()->ObjectVerify(); |
815 } | 816 } |
816 | 817 |
817 | 818 |
818 void AccessorInfo::AccessorInfoVerify() { | 819 void AccessorInfo::AccessorInfoVerify() { |
819 VerifyPointer(name()); | 820 VerifyPointer(name()); |
820 VerifyPointer(flag()); | 821 VerifyPointer(flag()); |
821 VerifyPointer(expected_receiver_type()); | 822 VerifyPointer(expected_receiver_type()); |
822 } | 823 } |
823 | 824 |
824 | 825 |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
940 line_offset()->SmiVerify(); | 941 line_offset()->SmiVerify(); |
941 column_offset()->SmiVerify(); | 942 column_offset()->SmiVerify(); |
942 VerifyPointer(wrapper()); | 943 VerifyPointer(wrapper()); |
943 type()->SmiVerify(); | 944 type()->SmiVerify(); |
944 VerifyPointer(line_ends()); | 945 VerifyPointer(line_ends()); |
945 VerifyPointer(id()); | 946 VerifyPointer(id()); |
946 } | 947 } |
947 | 948 |
948 | 949 |
949 void JSFunctionResultCache::JSFunctionResultCacheVerify() { | 950 void JSFunctionResultCache::JSFunctionResultCacheVerify() { |
950 JSFunction::cast(get(kFactoryIndex))->Verify(); | 951 JSFunction::cast(get(kFactoryIndex))->ObjectVerify(); |
951 | 952 |
952 int size = Smi::cast(get(kCacheSizeIndex))->value(); | 953 int size = Smi::cast(get(kCacheSizeIndex))->value(); |
953 CHECK(kEntriesIndex <= size); | 954 CHECK(kEntriesIndex <= size); |
954 CHECK(size <= length()); | 955 CHECK(size <= length()); |
955 CHECK_EQ(0, size % kEntrySize); | 956 CHECK_EQ(0, size % kEntrySize); |
956 | 957 |
957 int finger = Smi::cast(get(kFingerIndex))->value(); | 958 int finger = Smi::cast(get(kFingerIndex))->value(); |
958 CHECK(kEntriesIndex <= finger); | 959 CHECK(kEntriesIndex <= finger); |
959 CHECK((finger < size) || (finger == kEntriesIndex && finger == size)); | 960 CHECK((finger < size) || (finger == kEntriesIndex && finger == size)); |
960 CHECK_EQ(0, finger % kEntrySize); | 961 CHECK_EQ(0, finger % kEntrySize); |
961 | 962 |
962 if (FLAG_enable_slow_asserts) { | 963 if (FLAG_enable_slow_asserts) { |
963 for (int i = kEntriesIndex; i < size; i++) { | 964 for (int i = kEntriesIndex; i < size; i++) { |
964 CHECK(!get(i)->IsTheHole()); | 965 CHECK(!get(i)->IsTheHole()); |
965 get(i)->Verify(); | 966 get(i)->ObjectVerify(); |
966 } | 967 } |
967 for (int i = size; i < length(); i++) { | 968 for (int i = size; i < length(); i++) { |
968 CHECK(get(i)->IsTheHole()); | 969 CHECK(get(i)->IsTheHole()); |
969 get(i)->Verify(); | 970 get(i)->ObjectVerify(); |
970 } | 971 } |
971 } | 972 } |
972 } | 973 } |
973 | 974 |
974 | 975 |
975 void NormalizedMapCache::NormalizedMapCacheVerify() { | 976 void NormalizedMapCache::NormalizedMapCacheVerify() { |
976 FixedArray::cast(this)->Verify(); | 977 FixedArray::cast(this)->FixedArrayVerify(); |
977 if (FLAG_enable_slow_asserts) { | 978 if (FLAG_enable_slow_asserts) { |
978 for (int i = 0; i < length(); i++) { | 979 for (int i = 0; i < length(); i++) { |
979 Object* e = get(i); | 980 Object* e = get(i); |
980 if (e->IsMap()) { | 981 if (e->IsMap()) { |
981 Map::cast(e)->SharedMapVerify(); | 982 Map::cast(e)->SharedMapVerify(); |
982 } else { | 983 } else { |
983 CHECK(e->IsUndefined()); | 984 CHECK(e->IsUndefined()); |
984 } | 985 } |
985 } | 986 } |
986 } | 987 } |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1158 for (int i = 0; i < number_of_transitions(); ++i) { | 1159 for (int i = 0; i < number_of_transitions(); ++i) { |
1159 if (!CheckOneBackPointer(current_map, GetTarget(i))) return false; | 1160 if (!CheckOneBackPointer(current_map, GetTarget(i))) return false; |
1160 } | 1161 } |
1161 return true; | 1162 return true; |
1162 } | 1163 } |
1163 | 1164 |
1164 | 1165 |
1165 #endif // DEBUG | 1166 #endif // DEBUG |
1166 | 1167 |
1167 } } // namespace v8::internal | 1168 } } // namespace v8::internal |
OLD | NEW |