460 if (UseCompressedOops) {
461 objarray_follow_contents<narrowOop>(obj, 0);
462 } else {
463 objarray_follow_contents<oop>(obj, 0);
464 }
465 }
466
467 #if INCLUDE_ALL_GCS
468 void ObjArrayKlass::oop_follow_contents(ParCompactionManager* cm,
469 oop obj) {
470 assert(obj->is_array(), "obj must be array");
471 PSParallelCompact::follow_klass(cm, obj->klass());
472 if (UseCompressedOops) {
473 objarray_follow_contents<narrowOop>(cm, obj, 0);
474 } else {
475 objarray_follow_contents<oop>(cm, obj, 0);
476 }
477 }
478 #endif // INCLUDE_ALL_GCS
479
480 #define ObjArrayKlass_OOP_OOP_ITERATE_DEFN(OopClosureType, nv_suffix) \
481 \
482 int ObjArrayKlass::oop_oop_iterate##nv_suffix(oop obj, \
483 OopClosureType* closure) { \
484 SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::oa); \
485 assert (obj->is_array(), "obj must be array"); \
486 objArrayOop a = objArrayOop(obj); \
487 /* Get size before changing pointers. */ \
488 /* Don't call size() or oop_size() since that is a virtual call. */ \
489 int size = a->object_size(); \
490 if_do_metadata_checked(closure, nv_suffix) { \
491 closure->do_klass##nv_suffix(obj->klass()); \
492 } \
493 ObjArrayKlass_OOP_ITERATE(a, p, (closure)->do_oop##nv_suffix(p)) \
494 return size; \
495 }
496
497 #define ObjArrayKlass_OOP_OOP_ITERATE_DEFN_m(OopClosureType, nv_suffix) \
498 \
499 int ObjArrayKlass::oop_oop_iterate##nv_suffix##_m(oop obj, \
|
460 if (UseCompressedOops) {
461 objarray_follow_contents<narrowOop>(obj, 0);
462 } else {
463 objarray_follow_contents<oop>(obj, 0);
464 }
465 }
466
467 #if INCLUDE_ALL_GCS
468 void ObjArrayKlass::oop_follow_contents(ParCompactionManager* cm,
469 oop obj) {
470 assert(obj->is_array(), "obj must be array");
471 PSParallelCompact::follow_klass(cm, obj->klass());
472 if (UseCompressedOops) {
473 objarray_follow_contents<narrowOop>(cm, obj, 0);
474 } else {
475 objarray_follow_contents<oop>(cm, obj, 0);
476 }
477 }
478 #endif // INCLUDE_ALL_GCS
479
480 int ObjArrayKlass::get_linear_oop_intervals(oop obj, OopInterval* &start, int &size)
481 {
482 assert(obj->is_array(), "obj must be array");
483 objArrayOop a = objArrayOop(obj);
484
485 start->_offset = arrayOopDesc::base_offset_in_bytes(T_OBJECT); //base_offset_in_bytes();
486 start->_size = a->length();
487
488 size = a->object_size();
489
490 return 1;
491 }
492
493 #define ObjArrayKlass_OOP_OOP_ITERATE_DEFN(OopClosureType, nv_suffix) \
494 \
495 int ObjArrayKlass::oop_oop_iterate##nv_suffix(oop obj, \
496 OopClosureType* closure) { \
497 SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::oa); \
498 assert (obj->is_array(), "obj must be array"); \
499 objArrayOop a = objArrayOop(obj); \
500 /* Get size before changing pointers. */ \
501 /* Don't call size() or oop_size() since that is a virtual call. */ \
502 int size = a->object_size(); \
503 if_do_metadata_checked(closure, nv_suffix) { \
504 closure->do_klass##nv_suffix(obj->klass()); \
505 } \
506 ObjArrayKlass_OOP_ITERATE(a, p, (closure)->do_oop##nv_suffix(p)) \
507 return size; \
508 }
509
510 #define ObjArrayKlass_OOP_OOP_ITERATE_DEFN_m(OopClosureType, nv_suffix) \
511 \
512 int ObjArrayKlass::oop_oop_iterate##nv_suffix##_m(oop obj, \
|