< prev index next >

src/hotspot/share/prims/jvmtiTagMap.cpp

Print this page




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   }


< prev index next >