equal
deleted
inserted
replaced
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; |