< prev index next >

src/share/vm/oops/oop.inline.hpp

Print this page
rev 7183 : autospecialized oop_iterate using SFINAE and templates

*** 26,40 **** #define SHARE_VM_OOPS_OOP_INLINE_HPP #include "gc_implementation/shared/ageTable.hpp" #include "gc_implementation/shared/markSweep.inline.hpp" #include "gc_interface/collectedHeap.inline.hpp" #include "memory/barrierSet.inline.hpp" #include "memory/cardTableModRefBS.hpp" #include "memory/genCollectedHeap.hpp" #include "memory/generation.hpp" ! #include "memory/specialized_oop_closures.hpp" #include "oops/arrayKlass.hpp" #include "oops/arrayOop.hpp" #include "oops/klass.inline.hpp" #include "oops/markOop.inline.hpp" #include "oops/oop.hpp" --- 26,44 ---- #define SHARE_VM_OOPS_OOP_INLINE_HPP #include "gc_implementation/shared/ageTable.hpp" #include "gc_implementation/shared/markSweep.inline.hpp" #include "gc_interface/collectedHeap.inline.hpp" + #include "memory/iterator.inline.hpp" #include "memory/barrierSet.inline.hpp" #include "memory/cardTableModRefBS.hpp" #include "memory/genCollectedHeap.hpp" #include "memory/generation.hpp" ! #include "memory/specialized_oop_closures.inline.hpp" ! #include "oops/instanceMirrorKlass.inline.hpp" ! #include "oops/instanceRefKlass.inline.hpp" ! #include "oops/instanceClassLoaderKlass.inline.hpp" #include "oops/arrayKlass.hpp" #include "oops/arrayOop.hpp" #include "oops/klass.inline.hpp" #include "oops/markOop.inline.hpp" #include "oops/oop.hpp"
*** 682,698 **** --- 686,788 ---- } else { return slow_identity_hash(); } } + template <class OopClosureType> + inline typename enable_if<is_kind_of<ExtendedOopClosure, OopClosureType>::value, void>::type + oopDesc::do_metadata_if_applicable(OopClosureType *cl) { + if (OopClosureDispatcher::do_metadata<OopClosureType>(cl)) { + OopClosureDispatcher::do_klass<OopClosureType>(cl, klass()); + } + } + + template <class OopClosureType> + inline typename enable_if<!is_kind_of<ExtendedOopClosure, OopClosureType>::value, void>::type + oopDesc::do_metadata_if_applicable(OopClosureType *cl) {} + + template <class OopClosureType> + inline int oopDesc::oop_iterate_dispatch_tag(OopClosureType *blk, DispatchTag tag) { + // Closure is not explicitly specialized; determine which klass with a tag and call an inline dispatch method. + switch (tag) { + case _instance_mirror_klass: return static_cast<InstanceMirrorKlass*>(klass())->oop_iterate_and_dispatch<OopClosureType>(this, blk); + case _instance_class_loader_klass: return static_cast<InstanceClassLoaderKlass*>(klass())->InstanceClassLoaderKlass::oop_iterate_and_dispatch<OopClosureType>(this, blk); + case _instance_ref_klass: return static_cast<InstanceRefKlass*>(klass())->InstanceRefKlass::oop_iterate_and_dispatch<OopClosureType>(this, blk); + } + ShouldNotReachHere(); + return -1; + } + inline int oopDesc::adjust_pointers() { debug_only(int check_size = size()); int s = klass()->oop_adjust_pointers(this); assert(s == check_size, "should be the same"); return s; } + template <class OopClosureType> + inline int oopDesc::oop_iterate_internal(OopClosureType *blk) { + SpecializationStats::record_call(); + Klass::OopInterval interval; // Allocate space for an interval for arrays just in case it's needed + Klass::OopInterval *current = &interval; + int size; + int count = klass()->get_linear_oop_intervals(this, current, size); + if (count >= 0) { + if (UseCompressedOops) { + for (int i = 0; i < count; i++) { + narrowOop *current_oop = this->obj_field_addr<narrowOop>(current->_offset); + for (uint j = 0; j < current->_size; j++) { + OopClosureDispatcher::do_oop<OopClosureType, narrowOop>(blk, current_oop); + current_oop++; + } + } + current++; + } else { + for (int i = 0; i < count; i++) { + oop *current_oop = this->obj_field_addr<oop>(current->_offset); + for (uint j = 0; j < current->_size; j++) { + OopClosureDispatcher::do_oop<OopClosureType, oop>(blk, current_oop); + current_oop++; + } + } + current++; + } + + // The below call uses SFINAE and does nothing if the closure is not an ExtendedOopClosure + // Otherwise, if it is, it checks if it should send in metadata into the closure too and then does so + do_metadata_if_applicable<OopClosureType>(blk); + + return size; + } else { + // The Klass is of a slightly more advanced type, falling back to dispatch tag solution. + // This fallback parses the returned tag and identifies the klass implementation and calls it. + return oop_iterate_dispatch_tag<OopClosureType>(blk, DispatchTag(-count)); + } + } + + template <class OopClosureType> + inline typename enable_if<is_kind_of<ExtendedOopClosure, OopClosureType>::value, int>::type + oopDesc::oop_iterate(OopClosureType *blk) { + return oop_iterate_internal<OopClosureType>(blk); + } + + template <class OopClosureType> + inline typename enable_if<is_kind_of<OopClosure, OopClosureType>::value, int>::type + oopDesc::oop_iterate_no_header(OopClosureType *blk) { + if (is_kind_of<ExtendedOopClosure, OopClosureType>::value) { + NoHeaderOopClosure<OopClosureType> cl(blk); + return oop_iterate_internal(&cl); + } else { + return oop_iterate_internal(blk); + } + } + + inline int oopDesc::oop_iterate_no_header(OopClosure* blk, MemRegion mr) { + NoHeaderExtendedOopClosure cl(blk); + return oop_iterate(&cl, mr); + } + #define OOP_ITERATE_DEFN(OopClosureType, nv_suffix) \ \ inline int oopDesc::oop_iterate(OopClosureType* blk) { \ SpecializationStats::record_call(); \ return klass()->oop_oop_iterate##nv_suffix(this, blk); \
*** 701,723 **** inline int oopDesc::oop_iterate(OopClosureType* blk, MemRegion mr) { \ SpecializationStats::record_call(); \ return klass()->oop_oop_iterate##nv_suffix##_m(this, blk, mr); \ } - - inline int oopDesc::oop_iterate_no_header(OopClosure* blk) { - // The NoHeaderExtendedOopClosure wraps the OopClosure and proxies all - // the do_oop calls, but turns off all other features in ExtendedOopClosure. - NoHeaderExtendedOopClosure cl(blk); - return oop_iterate(&cl); - } - - inline int oopDesc::oop_iterate_no_header(OopClosure* blk, MemRegion mr) { - NoHeaderExtendedOopClosure cl(blk); - return oop_iterate(&cl, mr); - } - ALL_OOP_OOP_ITERATE_CLOSURES_1(OOP_ITERATE_DEFN) ALL_OOP_OOP_ITERATE_CLOSURES_2(OOP_ITERATE_DEFN) #if INCLUDE_ALL_GCS #define OOP_ITERATE_BACKWARDS_DEFN(OopClosureType, nv_suffix) \ --- 791,800 ----
< prev index next >