1.1 --- a/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp Fri Apr 11 09:56:35 2008 -0400 1.2 +++ b/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp Sun Apr 13 17:43:42 2008 -0400 1.3 @@ -65,16 +65,18 @@ 1.4 assert(_promotion_manager != NULL, "Sanity"); 1.5 } 1.6 1.7 - void do_oop(oop* p) { 1.8 - assert (*p != NULL, "expected non-null ref"); 1.9 - assert ((*p)->is_oop(), "expected an oop while scanning weak refs"); 1.10 + template <class T> void do_oop_work(T* p) { 1.11 + assert (!oopDesc::is_null(*p), "expected non-null ref"); 1.12 + assert ((oopDesc::load_decode_heap_oop_not_null(p))->is_oop(), 1.13 + "expected an oop while scanning weak refs"); 1.14 1.15 - oop obj = oop(*p); 1.16 // Weak refs may be visited more than once. 1.17 - if (PSScavenge::should_scavenge(obj, _to_space)) { 1.18 + if (PSScavenge::should_scavenge(p, _to_space)) { 1.19 PSScavenge::copy_and_push_safe_barrier(_promotion_manager, p); 1.20 } 1.21 } 1.22 + virtual void do_oop(oop* p) { PSKeepAliveClosure::do_oop_work(p); } 1.23 + virtual void do_oop(narrowOop* p) { PSKeepAliveClosure::do_oop_work(p); } 1.24 }; 1.25 1.26 class PSEvacuateFollowersClosure: public VoidClosure { 1.27 @@ -83,7 +85,7 @@ 1.28 public: 1.29 PSEvacuateFollowersClosure(PSPromotionManager* pm) : _promotion_manager(pm) {} 1.30 1.31 - void do_void() { 1.32 + virtual void do_void() { 1.33 assert(_promotion_manager != NULL, "Sanity"); 1.34 _promotion_manager->drain_stacks(true); 1.35 guarantee(_promotion_manager->stacks_empty(),