2941 }
2942
2943 return true;
2944 }
2945
2946 // an object references a class and its instance fields
2947 // (static fields are ignored here as we report these as
2948 // references from the class).
2949 inline bool VM_HeapWalkOperation::iterate_over_object(oop o) {
2950 // reference to the class
2951 if (!CallbackInvoker::report_class_reference(o, o->klass()->java_mirror())) {
2952 return false;
2953 }
2954
2955 // iterate over instance fields
2956 ClassFieldMap* field_map = JvmtiCachedClassFieldMap::get_map_of_instance_fields(o);
2957 for (int i=0; i<field_map->field_count(); i++) {
2958 ClassFieldDescriptor* field = field_map->field_at(i);
2959 char type = field->field_type();
2960 if (!is_primitive_field_type(type)) {
2961 oop fld_o = o->obj_field(field->field_offset());
2962 // ignore any objects that aren't visible to profiler
2963 if (fld_o != NULL) {
2964 assert(Universe::heap()->is_in(fld_o), "unsafe code should not "
2965 "have references to Klass* anymore");
2966 int slot = field->field_index();
2967 if (!CallbackInvoker::report_field_reference(o, fld_o, slot)) {
2968 return false;
2969 }
2970 }
2971 } else {
2972 if (is_reporting_primitive_fields()) {
2973 // primitive instance field
2974 address addr = (address)o + field->field_offset();
2975 int slot = field->field_index();
2976 if (!CallbackInvoker::report_primitive_instance_field(o, slot, addr, type)) {
2977 return false;
2978 }
2979 }
2980 }
2981 }
|
2941 }
2942
2943 return true;
2944 }
2945
2946 // an object references a class and its instance fields
2947 // (static fields are ignored here as we report these as
2948 // references from the class).
2949 inline bool VM_HeapWalkOperation::iterate_over_object(oop o) {
2950 // reference to the class
2951 if (!CallbackInvoker::report_class_reference(o, o->klass()->java_mirror())) {
2952 return false;
2953 }
2954
2955 // iterate over instance fields
2956 ClassFieldMap* field_map = JvmtiCachedClassFieldMap::get_map_of_instance_fields(o);
2957 for (int i=0; i<field_map->field_count(); i++) {
2958 ClassFieldDescriptor* field = field_map->field_at(i);
2959 char type = field->field_type();
2960 if (!is_primitive_field_type(type)) {
2961 oop fld_o = o->obj_field_access<AS_NO_KEEPALIVE | ON_UNKNOWN_OOP_REF>(field->field_offset());
2962 // ignore any objects that aren't visible to profiler
2963 if (fld_o != NULL) {
2964 assert(Universe::heap()->is_in(fld_o), "unsafe code should not "
2965 "have references to Klass* anymore");
2966 int slot = field->field_index();
2967 if (!CallbackInvoker::report_field_reference(o, fld_o, slot)) {
2968 return false;
2969 }
2970 }
2971 } else {
2972 if (is_reporting_primitive_fields()) {
2973 // primitive instance field
2974 address addr = (address)o + field->field_offset();
2975 int slot = field->field_index();
2976 if (!CallbackInvoker::report_primitive_instance_field(o, slot, addr, type)) {
2977 return false;
2978 }
2979 }
2980 }
2981 }
|