Mercurial > hg > truffle
comparison src/share/vm/prims/jvmtiTagMap.cpp @ 113:ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
Summary: Compressed oops in instances, arrays, and headers. Code contributors are coleenp, phh, never, swamyv
Reviewed-by: jmasa, kamg, acorn, tbell, kvn, rasbold
author | coleenp |
---|---|
date | Sun, 13 Apr 2008 17:43:42 -0400 |
parents | a61af66fc99e |
children | d1605aabd0a1 37f87013dfd8 |
comparison
equal
deleted
inserted
replaced
110:a49a647afe9a | 113:ba764ed4b6f2 |
---|---|
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; |