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

Print this page
rev 6796 : [mq]: templateOopIterate
rev 6799 : [mq]: latestChanges

*** 25,40 **** --- 25,158 ---- #ifndef SHARE_VM_OOPS_OBJARRAYKLASS_INLINE_HPP #define SHARE_VM_OOPS_OBJARRAYKLASS_INLINE_HPP #include "gc_implementation/shared/markSweep.inline.hpp" #include "oops/objArrayKlass.hpp" + #include "oops/oop.inline2.hpp" #include "utilities/macros.hpp" #if INCLUDE_ALL_GCS #include "gc_implementation/parallelScavenge/psCompactionManager.inline.hpp" #include "gc_implementation/parallelScavenge/psParallelCompact.hpp" #endif // INCLUDE_ALL_GCS + #define ObjArrayKlass_SPECIALIZED_OOP_ITERATE(T, a, p, do_oop) \ + { \ + T* p = (T*)(a)->base(); \ + T* const end = p + (a)->length(); \ + while (p < end) { \ + do_oop; \ + p++; \ + } \ + } + + #define ObjArrayKlass_OOP_ITERATE(a, p, do_oop) \ + if (UseCompressedOops) { \ + ObjArrayKlass_SPECIALIZED_OOP_ITERATE(narrowOop, \ + a, p, do_oop) \ + } else { \ + ObjArrayKlass_SPECIALIZED_OOP_ITERATE(oop, \ + a, p, do_oop) \ + } + + template <bool nv, typename OopClosureType> + int ObjArrayKlass::oop_oop_iterate(oop obj, + OopClosureType* closure) { + assert (obj->is_array(), "obj must be array"); + objArrayOop a = objArrayOop(obj); + /* Get size before changing pointers. */ + /* Don't call size() or oop_size() since that is a virtual call. */ + int size = a->object_size(); + if (Devirtualizer<nv, OopClosureType>::do_metadata(closure)) { + Devirtualizer<nv, OopClosureType>::do_klass(closure, obj->klass()); + } + ObjArrayKlass_OOP_ITERATE(a, p, (Devirtualizer<nv, OopClosureType>::do_oop(closure, p))) + return size; + } + + #define ObjArrayKlass_SPECIALIZED_BOUNDED_OOP_ITERATE(T, a, p, low, high, do_oop) \ + { \ + T* const l = (T*)(low); \ + T* const h = (T*)(high); \ + T* p = (T*)(a)->base(); \ + T* end = p + (a)->length(); \ + if (p < l) p = l; \ + if (end > h) end = h; \ + while (p < end) { \ + do_oop; \ + ++p; \ + } \ + } + + #define ObjArrayKlass_BOUNDED_OOP_ITERATE(a, p, low, high, do_oop) \ + if (UseCompressedOops) { \ + ObjArrayKlass_SPECIALIZED_BOUNDED_OOP_ITERATE(narrowOop, \ + a, p, low, high, do_oop) \ + } else { \ + ObjArrayKlass_SPECIALIZED_BOUNDED_OOP_ITERATE(oop, \ + a, p, low, high, do_oop) \ + } + + template <bool nv, typename OopClosureType> + int ObjArrayKlass::oop_oop_iterate_m(oop obj, + OopClosureType* closure, + MemRegion mr) { + assert(obj->is_array(), "obj must be array"); + objArrayOop a = objArrayOop(obj); + /* Get size before changing pointers. */ + /* Don't call size() or oop_size() since that is a virtual call */ + int size = a->object_size(); + if (Devirtualizer<nv, OopClosureType>::do_metadata(closure)) { + /* SSS: Do we need to pass down mr here? */ + Devirtualizer<nv, OopClosureType>::do_klass(closure, obj->klass()); + } + ObjArrayKlass_BOUNDED_OOP_ITERATE( + a, p, mr.start(), mr.end(), (Devirtualizer<nv, OopClosureType>::do_oop(closure, p))) + return size; + } + + template <bool nv, typename OopClosureType> + int ObjArrayKlass::oop_oop_iterate_backwards(oop obj, OopClosureType* closure) { + return oop_oop_iterate<nv>(obj, closure); + } + // Like oop_oop_iterate but only iterates over a specified range and only used + // for objArrayOops. + + template <bool nv, typename OopClosureType> + int ObjArrayKlass::oop_oop_iterate_range_t(oop obj, + OopClosureType* closure, + int start, int end) { + assert(obj->is_array(), "obj must be array"); + objArrayOop a = objArrayOop(obj); + /* Get size before changing pointers. */ + /* Don't call size() or oop_size() since that is a virtual call */ + int size = a->object_size(); + if (UseCompressedOops) { + HeapWord* low = start == 0 ? (HeapWord*)a : (HeapWord*)a->obj_at_addr<narrowOop>(start); + /* this might be wierd if end needs to be aligned on HeapWord boundary */ + HeapWord* high = (HeapWord*)((narrowOop*)a->base() + end); + MemRegion mr(low, high); + if (Devirtualizer<nv, OopClosureType>::do_metadata(closure)) { + /* SSS: Do we need to pass down mr here? */ + Devirtualizer<nv, OopClosureType>::do_klass(closure, obj->klass()); + } + ObjArrayKlass_SPECIALIZED_BOUNDED_OOP_ITERATE(narrowOop, + a, p, low, high, (Devirtualizer<nv, OopClosureType>::do_oop(closure, p))) + } else { + HeapWord* low = start == 0 ? (HeapWord*)a : (HeapWord*)a->obj_at_addr<oop>(start); + HeapWord* high = (HeapWord*)((oop*)a->base() + end); + MemRegion mr(low, high); + if (Devirtualizer<nv, OopClosureType>::do_metadata(closure)) { + /* SSS: Do we need to pass down mr here? */ + Devirtualizer<nv, OopClosureType>::do_klass(closure, obj->klass()); + } + ObjArrayKlass_SPECIALIZED_BOUNDED_OOP_ITERATE(oop, + a, p, low, high, (Devirtualizer<nv, OopClosureType>::do_oop(closure, p))) + } + return size; + } + + void ObjArrayKlass::oop_follow_contents(oop obj, int index) { if (UseCompressedOops) { objarray_follow_contents<narrowOop>(obj, index); } else { objarray_follow_contents<oop>(obj, index);