< prev index next >

src/hotspot/share/oops/instanceRefKlass.inline.hpp

Print this page

        

*** 51,70 **** if (contains(discovered_addr)) { Devirtualizer<nv>::do_oop(closure, discovered_addr); } } template <typename T, class OopClosureType> bool InstanceRefKlass::try_discover(oop obj, ReferenceType type, OopClosureType* closure) { ReferenceDiscoverer* rd = closure->ref_discoverer(); if (rd != NULL) { ! oop referent; ! if (type == REF_PHANTOM) { ! referent = HeapAccess<ON_PHANTOM_OOP_REF | AS_NO_KEEPALIVE>::oop_load(java_lang_ref_Reference::referent_addr_raw(obj)); ! } else { ! referent = HeapAccess<ON_WEAK_OOP_REF | AS_NO_KEEPALIVE>::oop_load(java_lang_ref_Reference::referent_addr_raw(obj)); ! } if (referent != NULL) { if (!referent->is_gc_marked()) { // Only try to discover if not yet marked. return rd->discover_reference(obj, type); } --- 51,73 ---- if (contains(discovered_addr)) { Devirtualizer<nv>::do_oop(closure, discovered_addr); } } + static inline oop load_referent(oop obj, ReferenceType type) { + if (type == REF_PHANTOM) { + return HeapAccess<ON_PHANTOM_OOP_REF | AS_NO_KEEPALIVE>::oop_load(java_lang_ref_Reference::referent_addr_raw(obj)); + } else { + return HeapAccess<ON_WEAK_OOP_REF | AS_NO_KEEPALIVE>::oop_load(java_lang_ref_Reference::referent_addr_raw(obj)); + } + } + template <typename T, class OopClosureType> bool InstanceRefKlass::try_discover(oop obj, ReferenceType type, OopClosureType* closure) { ReferenceDiscoverer* rd = closure->ref_discoverer(); if (rd != NULL) { ! oop referent = load_referent(obj, type); if (referent != NULL) { if (!referent->is_gc_marked()) { // Only try to discover if not yet marked. return rd->discover_reference(obj, type); }
< prev index next >