1.1 --- a/src/share/vm/memory/compactingPermGenGen.cpp Fri Apr 11 09:56:35 2008 -0400 1.2 +++ b/src/share/vm/memory/compactingPermGenGen.cpp Sun Apr 13 17:43:42 2008 -0400 1.3 @@ -49,9 +49,9 @@ 1.4 // to prevent visiting any object twice. 1.5 1.6 class RecursiveAdjustSharedObjectClosure : public OopClosure { 1.7 -public: 1.8 - void do_oop(oop* o) { 1.9 - oop obj = *o; 1.10 + protected: 1.11 + template <class T> inline void do_oop_work(T* p) { 1.12 + oop obj = oopDesc::load_decode_heap_oop_not_null(p); 1.13 if (obj->is_shared_readwrite()) { 1.14 if (obj->mark()->is_marked()) { 1.15 obj->init_mark(); // Don't revisit this object. 1.16 @@ -71,7 +71,10 @@ 1.17 } 1.18 } 1.19 } 1.20 - }; 1.21 + } 1.22 + public: 1.23 + virtual void do_oop(oop* p) { RecursiveAdjustSharedObjectClosure::do_oop_work(p); } 1.24 + virtual void do_oop(narrowOop* p) { RecursiveAdjustSharedObjectClosure::do_oop_work(p); } 1.25 }; 1.26 1.27 1.28 @@ -86,9 +89,9 @@ 1.29 // as doing so can cause hash codes to be computed, destroying 1.30 // forwarding pointers. 1.31 class TraversePlaceholdersClosure : public OopClosure { 1.32 - public: 1.33 - void do_oop(oop* o) { 1.34 - oop obj = *o; 1.35 + protected: 1.36 + template <class T> inline void do_oop_work(T* p) { 1.37 + oop obj = oopDesc::load_decode_heap_oop_not_null(p); 1.38 if (obj->klass() == Universe::symbolKlassObj() && 1.39 obj->is_shared_readonly()) { 1.40 symbolHandle sym((symbolOop) obj); 1.41 @@ -99,6 +102,10 @@ 1.42 } 1.43 } 1.44 } 1.45 + public: 1.46 + virtual void do_oop(oop* p) { TraversePlaceholdersClosure::do_oop_work(p); } 1.47 + virtual void do_oop(narrowOop* p) { TraversePlaceholdersClosure::do_oop_work(p); } 1.48 + 1.49 }; 1.50 1.51