2938 }
2939
2940 // iterate over the static fields
2941
2942 ClassFieldMap* field_map = ClassFieldMap::create_map_of_static_fields(k);
2943 for (i=0; i<field_map->field_count(); i++) {
2944 ClassFieldDescriptor* field = field_map->field_at(i);
2945 char type = field->field_type();
2946 if (!is_primitive_field_type(type)) {
2947 oop fld_o = mirror->obj_field(field->field_offset());
2948 assert(verify_static_oop(ik, mirror, field->field_offset()), "sanity check");
2949 if (fld_o != NULL) {
2950 int slot = field->field_index();
2951 if (!CallbackInvoker::report_static_field_reference(mirror, fld_o, slot)) {
2952 delete field_map;
2953 return false;
2954 }
2955 }
2956 } else {
2957 if (is_reporting_primitive_fields()) {
2958 address addr = (address)k + field->field_offset();
2959 int slot = field->field_index();
2960 if (!CallbackInvoker::report_primitive_static_field(mirror, slot, addr, type)) {
2961 delete field_map;
2962 return false;
2963 }
2964 }
2965 }
2966 }
2967 delete field_map;
2968
2969 return true;
2970 }
2971
2972 return true;
2973 }
2974
2975 // an object references a class and its instance fields
2976 // (static fields are ignored here as we report these as
2977 // references from the class).
2978 inline bool VM_HeapWalkOperation::iterate_over_object(oop o) {
|
2938 }
2939
2940 // iterate over the static fields
2941
2942 ClassFieldMap* field_map = ClassFieldMap::create_map_of_static_fields(k);
2943 for (i=0; i<field_map->field_count(); i++) {
2944 ClassFieldDescriptor* field = field_map->field_at(i);
2945 char type = field->field_type();
2946 if (!is_primitive_field_type(type)) {
2947 oop fld_o = mirror->obj_field(field->field_offset());
2948 assert(verify_static_oop(ik, mirror, field->field_offset()), "sanity check");
2949 if (fld_o != NULL) {
2950 int slot = field->field_index();
2951 if (!CallbackInvoker::report_static_field_reference(mirror, fld_o, slot)) {
2952 delete field_map;
2953 return false;
2954 }
2955 }
2956 } else {
2957 if (is_reporting_primitive_fields()) {
2958 address addr = (address)mirror + field->field_offset();
2959 int slot = field->field_index();
2960 if (!CallbackInvoker::report_primitive_static_field(mirror, slot, addr, type)) {
2961 delete field_map;
2962 return false;
2963 }
2964 }
2965 }
2966 }
2967 delete field_map;
2968
2969 return true;
2970 }
2971
2972 return true;
2973 }
2974
2975 // an object references a class and its instance fields
2976 // (static fields are ignored here as we report these as
2977 // references from the class).
2978 inline bool VM_HeapWalkOperation::iterate_over_object(oop o) {
|