void ObjArrayKlass::oop_oop_iterate_elements_specialized(objArrayOop a, OopClosureType* closure) { T* p = (T*)a->base(); T* const end = p + a->length(); for (;p < end; p++) { Devirtualizer<nv>::do_oop(closure, p); } }
void ObjArrayKlass::oop_oop_iterate_range_specialized(objArrayOop a, OopClosureType* closure, int start, int end) { if (Devirtualizer<nv>::do_metadata(closure)) { Devirtualizer<nv>::do_klass(closure, a->klass()); } T* low = start == 0 ? cast_from_oop<T*>(a) : a->obj_at_addr<T>(start); T* high = (T*)a->base() + end; oop_oop_iterate_elements_specialized_bounded<nv, T>(a, closure, low, high); }
inline void oop_pc_follow_contents_specialized(objArrayOop obj, int index, ParCompactionManager* cm) { const size_t len = size_t(obj->length()); const size_t beg_index = size_t(index); assert(beg_index < len || len == 0, "index too large"); const size_t stride = MIN2(len - beg_index, ObjArrayMarkingStride); const size_t end_index = beg_index + stride; T* const base = (T*)obj->base(); T* const beg = base + beg_index; T* const end = base + end_index; // Push the non-NULL elements of the next stride on the marking stack. for (T* e = beg; e < end; e++) { cm->mark_and_push<T>(e); } if (end_index < len) { cm->push_objarray(obj, end_index); // Push the continuation. } }
void ObjArrayKlass::oop_oop_iterate_elements_specialized_bounded( objArrayOop a, OopClosureType* closure, void* low, void* high) { 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; } for (;p < end; ++p) { Devirtualizer<nv>::do_oop(closure, p); } }
void ObjArrayKlass::oop_oop_iterate_range_specialized(objArrayOop a, OopClosureType* closure, int start, int end) { T* low = start == 0 ? cast_from_oop<T*>(a) : a->obj_at_addr<T>(start); T* high = (T*)a->base() + end; oop_oop_iterate_elements_specialized_bounded<nv, T>(a, closure, low, high); }