6094 // A non-array may have been imprecisely marked; we need |
6094 // A non-array may have been imprecisely marked; we need |
6095 // to scan object in its entirety. |
6095 // to scan object in its entirety. |
6096 size = CompactibleFreeListSpace::adjustObjectSize( |
6096 size = CompactibleFreeListSpace::adjustObjectSize( |
6097 p->oop_iterate_size(_scanningClosure)); |
6097 p->oop_iterate_size(_scanningClosure)); |
6098 } |
6098 } |
6099 #ifdef ASSERT |
6099 #ifdef ASSERT |
6100 size_t direct_size = |
6100 size_t direct_size = |
6101 CompactibleFreeListSpace::adjustObjectSize(p->size()); |
6101 CompactibleFreeListSpace::adjustObjectSize(p->size()); |
6102 assert(size == direct_size, "Inconsistency in size"); |
6102 assert(size == direct_size, "Inconsistency in size"); |
6103 assert(size >= 3, "Necessary for Printezis marks to work"); |
6103 assert(size >= 3, "Necessary for Printezis marks to work"); |
6104 if (!_bitMap->isMarked(addr+1)) { |
6104 HeapWord* start_pbit = addr + 1; |
6105 _bitMap->verifyNoOneBitsInRange(addr+2, addr+size); |
6105 HeapWord* end_pbit = addr + size - 1; |
6106 } else { |
6106 assert(_bitMap->isMarked(start_pbit) == _bitMap->isMarked(end_pbit), |
6107 _bitMap->verifyNoOneBitsInRange(addr+2, addr+size-1); |
6107 "inconsistent Printezis mark"); |
6108 assert(_bitMap->isMarked(addr+size-1), |
6108 // Verify inner mark bits (between Printezis bits) are clear, |
6109 "inconsistent Printezis mark"); |
6109 // but don't repeat if there are multiple dirty regions for |
6110 } |
6110 // the same object, to avoid potential O(N^2) performance. |
6111 #endif // ASSERT |
6111 if (addr != _last_scanned_object) { |
|
6112 _bitMap->verifyNoOneBitsInRange(start_pbit + 1, end_pbit); |
|
6113 _last_scanned_object = addr; |
|
6114 } |
|
6115 #endif // ASSERT |
6112 } else { |
6116 } else { |
6113 // An uninitialized object. |
6117 // An uninitialized object. |
6114 assert(_bitMap->isMarked(addr+1), "missing Printezis mark?"); |
6118 assert(_bitMap->isMarked(addr+1), "missing Printezis mark?"); |
6115 HeapWord* nextOneAddr = _bitMap->getNextMarkedWordAddress(addr + 2); |
6119 HeapWord* nextOneAddr = _bitMap->getNextMarkedWordAddress(addr + 2); |
6116 size = pointer_delta(nextOneAddr + 1, addr); |
6120 size = pointer_delta(nextOneAddr + 1, addr); |