284 assert(!pm->depth_first(), "invariant"); |
284 assert(!pm->depth_first(), "invariant"); |
285 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); |
285 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); |
286 ik->copy_static_fields(pm); |
286 ik->copy_static_fields(pm); |
287 |
287 |
288 oop* loader_addr = ik->adr_class_loader(); |
288 oop* loader_addr = ik->adr_class_loader(); |
289 if (PSScavenge::should_scavenge(*loader_addr)) { |
289 if (PSScavenge::should_scavenge(loader_addr)) { |
290 pm->claim_or_forward_breadth(loader_addr); |
290 pm->claim_or_forward_breadth(loader_addr); |
291 } |
291 } |
292 |
292 |
293 oop* pd_addr = ik->adr_protection_domain(); |
293 oop* pd_addr = ik->adr_protection_domain(); |
294 if (PSScavenge::should_scavenge(*pd_addr)) { |
294 if (PSScavenge::should_scavenge(pd_addr)) { |
295 pm->claim_or_forward_breadth(pd_addr); |
295 pm->claim_or_forward_breadth(pd_addr); |
296 } |
296 } |
297 |
297 |
298 oop* sg_addr = ik->adr_signers(); |
298 oop* sg_addr = ik->adr_signers(); |
299 if (PSScavenge::should_scavenge(*sg_addr)) { |
299 if (PSScavenge::should_scavenge(sg_addr)) { |
300 pm->claim_or_forward_breadth(sg_addr); |
300 pm->claim_or_forward_breadth(sg_addr); |
301 } |
301 } |
302 |
302 |
303 klassKlass::oop_copy_contents(pm, obj); |
303 klassKlass::oop_copy_contents(pm, obj); |
304 } |
304 } |
307 assert(pm->depth_first(), "invariant"); |
307 assert(pm->depth_first(), "invariant"); |
308 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); |
308 instanceKlass* ik = instanceKlass::cast(klassOop(obj)); |
309 ik->push_static_fields(pm); |
309 ik->push_static_fields(pm); |
310 |
310 |
311 oop* loader_addr = ik->adr_class_loader(); |
311 oop* loader_addr = ik->adr_class_loader(); |
312 if (PSScavenge::should_scavenge(*loader_addr)) { |
312 if (PSScavenge::should_scavenge(loader_addr)) { |
313 pm->claim_or_forward_depth(loader_addr); |
313 pm->claim_or_forward_depth(loader_addr); |
314 } |
314 } |
315 |
315 |
316 oop* pd_addr = ik->adr_protection_domain(); |
316 oop* pd_addr = ik->adr_protection_domain(); |
317 if (PSScavenge::should_scavenge(*pd_addr)) { |
317 if (PSScavenge::should_scavenge(pd_addr)) { |
318 pm->claim_or_forward_depth(pd_addr); |
318 pm->claim_or_forward_depth(pd_addr); |
319 } |
319 } |
320 |
320 |
321 oop* sg_addr = ik->adr_signers(); |
321 oop* sg_addr = ik->adr_signers(); |
322 if (PSScavenge::should_scavenge(*sg_addr)) { |
322 if (PSScavenge::should_scavenge(sg_addr)) { |
323 pm->claim_or_forward_depth(sg_addr); |
323 pm->claim_or_forward_depth(sg_addr); |
324 } |
324 } |
325 |
325 |
326 klassKlass::oop_copy_contents(pm, obj); |
326 klassKlass::oop_copy_contents(pm, obj); |
327 } |
327 } |
600 return "{instance class}"; |
600 return "{instance class}"; |
601 } |
601 } |
602 |
602 |
603 // Verification |
603 // Verification |
604 |
604 |
605 |
|
606 class VerifyFieldClosure: public OopClosure { |
605 class VerifyFieldClosure: public OopClosure { |
|
606 protected: |
|
607 template <class T> void do_oop_work(T* p) { |
|
608 guarantee(Universe::heap()->is_in(p), "should be in heap"); |
|
609 oop obj = oopDesc::load_decode_heap_oop(p); |
|
610 guarantee(obj->is_oop_or_null(), "should be in heap"); |
|
611 } |
607 public: |
612 public: |
608 void do_oop(oop* p) { |
613 virtual void do_oop(oop* p) { VerifyFieldClosure::do_oop_work(p); } |
609 guarantee(Universe::heap()->is_in(p), "should be in heap"); |
614 virtual void do_oop(narrowOop* p) { VerifyFieldClosure::do_oop_work(p); } |
610 guarantee((*p)->is_oop_or_null(), "should be in heap"); |
|
611 } |
|
612 }; |
615 }; |
613 |
|
614 |
616 |
615 void instanceKlassKlass::oop_verify_on(oop obj, outputStream* st) { |
617 void instanceKlassKlass::oop_verify_on(oop obj, outputStream* st) { |
616 klassKlass::oop_verify_on(obj, st); |
618 klassKlass::oop_verify_on(obj, st); |
617 if (!obj->partially_loaded()) { |
619 if (!obj->partially_loaded()) { |
618 Thread *thread = Thread::current(); |
620 Thread *thread = Thread::current(); |