hotspot/src/share/vm/prims/jvmtiTagMap.cpp
changeset 360 21d113ecbf6a
parent 1 489c9b5090e2
child 670 ddf3e9583f2f
child 1374 4c24294029a9
equal deleted inserted replaced
357:f4edb0d9f109 360:21d113ecbf6a
  2660 
  2660 
  2661     // invoke the callback
  2661     // invoke the callback
  2662     _continue = CallbackInvoker::report_simple_root(kind, o);
  2662     _continue = CallbackInvoker::report_simple_root(kind, o);
  2663 
  2663 
  2664   }
  2664   }
       
  2665   virtual void do_oop(narrowOop* obj_p) { ShouldNotReachHere(); }
  2665 };
  2666 };
  2666 
  2667 
  2667 // A supporting closure used to process JNI locals
  2668 // A supporting closure used to process JNI locals
  2668 class JNILocalRootsClosure : public OopClosure {
  2669 class JNILocalRootsClosure : public OopClosure {
  2669  private:
  2670  private:
  2702     }
  2703     }
  2703 
  2704 
  2704     // invoke the callback
  2705     // invoke the callback
  2705     _continue = CallbackInvoker::report_jni_local_root(_thread_tag, _tid, _depth, _method, o);
  2706     _continue = CallbackInvoker::report_jni_local_root(_thread_tag, _tid, _depth, _method, o);
  2706   }
  2707   }
       
  2708   virtual void do_oop(narrowOop* obj_p) { ShouldNotReachHere(); }
  2707 };
  2709 };
  2708 
  2710 
  2709 
  2711 
  2710 // A VM operation to iterate over objects that are reachable from
  2712 // A VM operation to iterate over objects that are reachable from
  2711 // a set of roots or an initial object.
  2713 // a set of roots or an initial object.
  2876   }
  2878   }
  2877   return true;
  2879   return true;
  2878 }
  2880 }
  2879 
  2881 
  2880 // verify that a static oop field is in range
  2882 // verify that a static oop field is in range
  2881 static inline bool verify_static_oop(instanceKlass* ik, oop* obj_p) {
  2883 static inline bool verify_static_oop(instanceKlass* ik,
  2882   oop* start = ik->start_of_static_fields();
  2884                                      klassOop k, int offset) {
  2883   oop* end = start + ik->static_oop_field_size();
  2885   address obj_p = (address)k + offset;
       
  2886   address start = (address)ik->start_of_static_fields();
       
  2887   address end = start + (ik->static_oop_field_size() * heapOopSize);
  2884   assert(end >= start, "sanity check");
  2888   assert(end >= start, "sanity check");
  2885 
  2889 
  2886   if (obj_p >= start && obj_p < end) {
  2890   if (obj_p >= start && obj_p < end) {
  2887     return true;
  2891     return true;
  2888   } else {
  2892   } else {
  2979     ClassFieldMap* field_map = ClassFieldMap::create_map_of_static_fields(k);
  2983     ClassFieldMap* field_map = ClassFieldMap::create_map_of_static_fields(k);
  2980     for (i=0; i<field_map->field_count(); i++) {
  2984     for (i=0; i<field_map->field_count(); i++) {
  2981       ClassFieldDescriptor* field = field_map->field_at(i);
  2985       ClassFieldDescriptor* field = field_map->field_at(i);
  2982       char type = field->field_type();
  2986       char type = field->field_type();
  2983       if (!is_primitive_field_type(type)) {
  2987       if (!is_primitive_field_type(type)) {
  2984         address addr = (address)k + field->field_offset();
  2988         oop fld_o = k->obj_field(field->field_offset());
  2985         oop* f = (oop*)addr;
  2989         assert(verify_static_oop(ik, k, field->field_offset()), "sanity check");
  2986         assert(verify_static_oop(ik, f), "sanity check");
       
  2987         oop fld_o = *f;
       
  2988         if (fld_o != NULL) {
  2990         if (fld_o != NULL) {
  2989           int slot = field->field_index();
  2991           int slot = field->field_index();
  2990           if (!CallbackInvoker::report_static_field_reference(mirror, fld_o, slot)) {
  2992           if (!CallbackInvoker::report_static_field_reference(mirror, fld_o, slot)) {
  2991             delete field_map;
  2993             delete field_map;
  2992             return false;
  2994             return false;
  3024   ClassFieldMap* field_map = JvmtiCachedClassFieldMap::get_map_of_instance_fields(o);
  3026   ClassFieldMap* field_map = JvmtiCachedClassFieldMap::get_map_of_instance_fields(o);
  3025   for (int i=0; i<field_map->field_count(); i++) {
  3027   for (int i=0; i<field_map->field_count(); i++) {
  3026     ClassFieldDescriptor* field = field_map->field_at(i);
  3028     ClassFieldDescriptor* field = field_map->field_at(i);
  3027     char type = field->field_type();
  3029     char type = field->field_type();
  3028     if (!is_primitive_field_type(type)) {
  3030     if (!is_primitive_field_type(type)) {
  3029       address addr = (address)o + field->field_offset();
  3031       oop fld_o = o->obj_field(field->field_offset());
  3030       oop* f = (oop*)addr;
       
  3031       oop fld_o = *f;
       
  3032       if (fld_o != NULL) {
  3032       if (fld_o != NULL) {
  3033         // reflection code may have a reference to a klassOop.
  3033         // reflection code may have a reference to a klassOop.
  3034         // - see sun.reflect.UnsafeStaticFieldAccessorImpl and sun.misc.Unsafe
  3034         // - see sun.reflect.UnsafeStaticFieldAccessorImpl and sun.misc.Unsafe
  3035         if (fld_o->is_klass()) {
  3035         if (fld_o->is_klass()) {
  3036           klassOop k = (klassOop)fld_o;
  3036           klassOop k = (klassOop)fld_o;