Fri, 25 Mar 2011 17:39:20 -0700
Merge
1.1 --- a/src/share/vm/memory/cardTableRS.cpp Thu Mar 24 23:06:13 2011 -0700 1.2 +++ b/src/share/vm/memory/cardTableRS.cpp Fri Mar 25 17:39:20 2011 -0700 1.3 @@ -318,17 +318,28 @@ 1.4 protected: 1.5 template <class T> void do_oop_work(T* p) { 1.6 HeapWord* jp = (HeapWord*)p; 1.7 - if (jp >= _begin && jp < _end) { 1.8 - oop obj = oopDesc::load_decode_heap_oop(p); 1.9 - guarantee(obj == NULL || 1.10 - (HeapWord*)p < _boundary || 1.11 - (HeapWord*)obj >= _boundary, 1.12 - "pointer on clean card crosses boundary"); 1.13 - } 1.14 + assert(jp >= _begin && jp < _end, 1.15 + err_msg("Error: jp " PTR_FORMAT " should be within " 1.16 + "[_begin, _end) = [" PTR_FORMAT "," PTR_FORMAT ")", 1.17 + _begin, _end)); 1.18 + oop obj = oopDesc::load_decode_heap_oop(p); 1.19 + guarantee(obj == NULL || (HeapWord*)obj >= _boundary, 1.20 + err_msg("pointer " PTR_FORMAT " at " PTR_FORMAT " on " 1.21 + "clean card crosses boundary" PTR_FORMAT, 1.22 + (HeapWord*)obj, jp, _boundary)); 1.23 } 1.24 + 1.25 public: 1.26 VerifyCleanCardClosure(HeapWord* b, HeapWord* begin, HeapWord* end) : 1.27 - _boundary(b), _begin(begin), _end(end) {} 1.28 + _boundary(b), _begin(begin), _end(end) { 1.29 + assert(b <= begin, 1.30 + err_msg("Error: boundary " PTR_FORMAT " should be at or below begin " PTR_FORMAT, 1.31 + b, begin)); 1.32 + assert(begin <= end, 1.33 + err_msg("Error: begin " PTR_FORMAT " should be strictly below end " PTR_FORMAT, 1.34 + begin, end)); 1.35 + } 1.36 + 1.37 virtual void do_oop(oop* p) { VerifyCleanCardClosure::do_oop_work(p); } 1.38 virtual void do_oop(narrowOop* p) { VerifyCleanCardClosure::do_oop_work(p); } 1.39 }; 1.40 @@ -392,13 +403,14 @@ 1.41 } 1.42 } 1.43 // Now traverse objects until end. 1.44 - HeapWord* cur = start_block; 1.45 - VerifyCleanCardClosure verify_blk(gen_boundary, begin, end); 1.46 - while (cur < end) { 1.47 - if (s->block_is_obj(cur) && s->obj_is_alive(cur)) { 1.48 - oop(cur)->oop_iterate(&verify_blk); 1.49 + if (begin < end) { 1.50 + MemRegion mr(begin, end); 1.51 + VerifyCleanCardClosure verify_blk(gen_boundary, begin, end); 1.52 + for (HeapWord* cur = start_block; cur < end; cur += s->block_size(cur)) { 1.53 + if (s->block_is_obj(cur) && s->obj_is_alive(cur)) { 1.54 + oop(cur)->oop_iterate(&verify_blk, mr); 1.55 + } 1.56 } 1.57 - cur += s->block_size(cur); 1.58 } 1.59 cur_entry = first_dirty; 1.60 } else {
2.1 --- a/src/share/vm/oops/constantPoolKlass.cpp Thu Mar 24 23:06:13 2011 -0700 2.2 +++ b/src/share/vm/oops/constantPoolKlass.cpp Fri Mar 25 17:39:20 2011 -0700 2.3 @@ -245,13 +245,13 @@ 2.4 } 2.5 oop* addr; 2.6 addr = cp->tags_addr(); 2.7 - blk->do_oop(addr); 2.8 + if (mr.contains(addr)) blk->do_oop(addr); 2.9 addr = cp->cache_addr(); 2.10 - blk->do_oop(addr); 2.11 + if (mr.contains(addr)) blk->do_oop(addr); 2.12 addr = cp->operands_addr(); 2.13 - blk->do_oop(addr); 2.14 + if (mr.contains(addr)) blk->do_oop(addr); 2.15 addr = cp->pool_holder_addr(); 2.16 - blk->do_oop(addr); 2.17 + if (mr.contains(addr)) blk->do_oop(addr); 2.18 return size; 2.19 } 2.20