< prev index next >
src/share/vm/gc_implementation/g1/heapRegion.cpp
Print this page
rev 7697 : imported patch 8069760-remove-duplicate-oop_iterate
*** 433,475 ****
// If we finish the above loop...We have a parseable object that
// begins on or before the start of the memory region, and ends
// inside or spans the entire region.
- assert(obj == oop(cur), "sanity");
assert(cur <= start, "Loop postcondition");
- assert(obj->klass_or_null() != NULL, "Loop postcondition");
- assert((cur + block_size(cur)) > start, "Loop postcondition");
! if (!g1h->is_obj_dead(obj)) {
! obj->oop_iterate(cl, mr);
! }
!
! while (cur < end) {
! obj = oop(cur);
if (obj->klass_or_null() == NULL) {
// Ran into an unparseable point.
return cur;
! };
! // Otherwise:
! next = cur + block_size(cur);
if (!g1h->is_obj_dead(obj)) {
! if (next < end || !obj->is_objArray()) {
! // This object either does not span the MemRegion
! // boundary, or if it does it's not an array.
! // Apply closure to whole object.
obj->oop_iterate(cl);
} else {
- // This obj is an array that spans the boundary.
- // Stop at the boundary.
obj->oop_iterate(cl, mr);
}
}
! cur = next;
! }
return NULL;
}
// Code roots support
--- 433,470 ----
// If we finish the above loop...We have a parseable object that
// begins on or before the start of the memory region, and ends
// inside or spans the entire region.
assert(cur <= start, "Loop postcondition");
! do {
! assert(obj->klass_or_null() != NULL, "Loop invariant");
! assert((cur + block_size(cur)) > (HeapWord*)obj, "Loop invariant");
! assert(obj == oop(cur), "Loop invariant");
if (obj->klass_or_null() == NULL) {
// Ran into an unparseable point.
return cur;
! }
! // Advance the current pointer. "obj" still points to the object to iterate.
! cur = cur + block_size(cur);
if (!g1h->is_obj_dead(obj)) {
! // Non-object arrays are sometimes marked imprecise at the object start. We
! // always need to iterate over them in full.
! // We only iterate over object arrays in full if they are completely contained
! // in the memory region.
! if (!obj->is_objArray() || (((HeapWord*)obj) >= start && cur < end)) {
obj->oop_iterate(cl);
} else {
obj->oop_iterate(cl, mr);
}
}
! obj = oop(cur);
! } while (cur < end);
!
return NULL;
}
// Code roots support
*** 678,687 ****
--- 673,683 ----
#endif // PRODUCT
}
template <class T>
void do_oop_work(T* p) {
+ // gclog_or_tty->print_cr("Verifying address " PTR_FORMAT, p2i(p));
assert(_containing_obj != NULL, "Precondition");
assert(!_g1h->is_obj_dead_cond(_containing_obj, _vo),
"Precondition");
T heap_oop = oopDesc::load_heap_oop(p);
if (!oopDesc::is_null(heap_oop)) {
< prev index next >