< prev index next >

src/share/vm/classfile/javaClasses.cpp

Print this page




  35 #include "memory/resourceArea.hpp"
  36 #include "memory/universe.inline.hpp"
  37 #include "oops/fieldStreams.hpp"
  38 #include "oops/instanceKlass.hpp"
  39 #include "oops/instanceMirrorKlass.hpp"
  40 #include "oops/klass.hpp"
  41 #include "oops/method.hpp"
  42 #include "oops/symbol.hpp"
  43 #include "oops/typeArrayOop.hpp"
  44 #include "prims/jvmtiRedefineClassesTrace.hpp"
  45 #include "runtime/fieldDescriptor.hpp"
  46 #include "runtime/handles.inline.hpp"
  47 #include "runtime/interfaceSupport.hpp"
  48 #include "runtime/java.hpp"
  49 #include "runtime/javaCalls.hpp"
  50 #include "runtime/safepoint.hpp"
  51 #include "runtime/thread.inline.hpp"
  52 #include "runtime/vframe.hpp"
  53 #include "utilities/preserveException.hpp"
  54 




  55 PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
  56 
  57 #define INJECTED_FIELD_COMPUTE_OFFSET(klass, name, signature, may_be_java)    \
  58   klass::_##name##_offset = JavaClasses::compute_injected_offset(JavaClasses::klass##_##name##_enum);
  59 
  60 #define DECLARE_INJECTED_FIELD(klass, name, signature, may_be_java)           \
  61   { SystemDictionary::WK_KLASS_ENUM_NAME(klass), vmSymbols::VM_SYMBOL_ENUM_NAME(name##_name), vmSymbols::VM_SYMBOL_ENUM_NAME(signature), may_be_java },
  62 
  63 InjectedField JavaClasses::_injected_fields[] = {
  64   ALL_INJECTED_FIELDS(DECLARE_INJECTED_FIELD)
  65 };
  66 
  67 int JavaClasses::compute_injected_offset(InjectedFieldID id) {
  68   return _injected_fields[id].compute_offset();
  69 }
  70 
  71 
  72 InjectedField* JavaClasses::get_injected(Symbol* class_name, int* field_count) {
  73   *field_count = 0;
  74 


1191 void java_lang_ThreadGroup::compute_offsets() {
1192   assert(_parent_offset == 0, "offsets should be initialized only once");
1193 
1194   Klass* k = SystemDictionary::ThreadGroup_klass();
1195 
1196   compute_offset(_parent_offset,      k, vmSymbols::parent_name(),      vmSymbols::threadgroup_signature());
1197   compute_offset(_name_offset,        k, vmSymbols::name_name(),        vmSymbols::string_signature());
1198   compute_offset(_threads_offset,     k, vmSymbols::threads_name(),     vmSymbols::thread_array_signature());
1199   compute_offset(_groups_offset,      k, vmSymbols::groups_name(),      vmSymbols::threadgroup_array_signature());
1200   compute_offset(_maxPriority_offset, k, vmSymbols::maxPriority_name(), vmSymbols::int_signature());
1201   compute_offset(_destroyed_offset,   k, vmSymbols::destroyed_name(),   vmSymbols::bool_signature());
1202   compute_offset(_daemon_offset,      k, vmSymbols::daemon_name(),      vmSymbols::bool_signature());
1203   compute_offset(_vmAllowSuspension_offset, k, vmSymbols::vmAllowSuspension_name(), vmSymbols::bool_signature());
1204   compute_offset(_nthreads_offset,    k, vmSymbols::nthreads_name(),    vmSymbols::int_signature());
1205   compute_offset(_ngroups_offset,     k, vmSymbols::ngroups_name(),     vmSymbols::int_signature());
1206 }
1207 
1208 oop java_lang_Throwable::unassigned_stacktrace() {
1209   InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::Throwable_klass());
1210   address addr = ik->static_field_addr(static_unassigned_stacktrace_offset);

1211   if (UseCompressedOops) {
1212     return oopDesc::load_decode_heap_oop((narrowOop *)addr);
1213   } else {
1214     return oopDesc::load_decode_heap_oop((oop*)addr);




1215   }


1216 }
1217 
1218 oop java_lang_Throwable::backtrace(oop throwable) {
1219   return throwable->obj_field_acquire(backtrace_offset);
1220 }
1221 
1222 
1223 void java_lang_Throwable::set_backtrace(oop throwable, oop value) {
1224   throwable->release_obj_field_put(backtrace_offset, value);
1225 }
1226 
1227 
1228 oop java_lang_Throwable::message(oop throwable) {
1229   return throwable->obj_field(detailMessage_offset);
1230 }
1231 
1232 
1233 oop java_lang_Throwable::message(Handle throwable) {
1234   return throwable->obj_field(detailMessage_offset);
1235 }


2631   case T_SHORT:     st->print("%d", value->s);                      break;
2632   case T_INT:       st->print("%d", value->i);                      break;
2633   case T_LONG:      st->print(INT64_FORMAT, value->j);              break;
2634   case T_FLOAT:     st->print("%f", value->f);                      break;
2635   case T_DOUBLE:    st->print("%lf", value->d);                     break;
2636   default:          st->print("type %d?", type);                    break;
2637   }
2638 }
2639 
2640 
2641 // Support for java_lang_ref_Reference
2642 HeapWord *java_lang_ref_Reference::pending_list_lock_addr() {
2643   InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::Reference_klass());
2644   address addr = ik->static_field_addr(static_lock_offset);
2645   return (HeapWord*) addr;
2646 }
2647 
2648 oop java_lang_ref_Reference::pending_list_lock() {
2649   InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::Reference_klass());
2650   address addr = ik->static_field_addr(static_lock_offset);

2651   if (UseCompressedOops) {
2652     return oopDesc::load_decode_heap_oop((narrowOop *)addr);
2653   } else {
2654     return oopDesc::load_decode_heap_oop((oop*)addr);




2655   }


2656 }
2657 
2658 HeapWord *java_lang_ref_Reference::pending_list_addr() {
2659   InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::Reference_klass());
2660   address addr = ik->static_field_addr(static_pending_offset);
2661   // XXX This might not be HeapWord aligned, almost rather be char *.
2662   return (HeapWord*)addr;
2663 }
2664 
2665 oop java_lang_ref_Reference::pending_list() {
2666   char *addr = (char *)pending_list_addr();

2667   if (UseCompressedOops) {
2668     return oopDesc::load_decode_heap_oop((narrowOop *)addr);
2669   } else {
2670     return oopDesc::load_decode_heap_oop((oop*)addr);




2671   }


2672 }
2673 
2674 
2675 // Support for java_lang_ref_SoftReference
2676 
2677 jlong java_lang_ref_SoftReference::timestamp(oop ref) {
2678   return ref->long_field(timestamp_offset);
2679 }
2680 
2681 jlong java_lang_ref_SoftReference::clock() {
2682   InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::SoftReference_klass());
2683   jlong* offset = (jlong*)ik->static_field_addr(static_clock_offset);
2684   return *offset;
2685 }
2686 
2687 void java_lang_ref_SoftReference::set_clock(jlong value) {
2688   InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::SoftReference_klass());
2689   jlong* offset = (jlong*)ik->static_field_addr(static_clock_offset);
2690   *offset = value;
2691 }




  35 #include "memory/resourceArea.hpp"
  36 #include "memory/universe.inline.hpp"
  37 #include "oops/fieldStreams.hpp"
  38 #include "oops/instanceKlass.hpp"
  39 #include "oops/instanceMirrorKlass.hpp"
  40 #include "oops/klass.hpp"
  41 #include "oops/method.hpp"
  42 #include "oops/symbol.hpp"
  43 #include "oops/typeArrayOop.hpp"
  44 #include "prims/jvmtiRedefineClassesTrace.hpp"
  45 #include "runtime/fieldDescriptor.hpp"
  46 #include "runtime/handles.inline.hpp"
  47 #include "runtime/interfaceSupport.hpp"
  48 #include "runtime/java.hpp"
  49 #include "runtime/javaCalls.hpp"
  50 #include "runtime/safepoint.hpp"
  51 #include "runtime/thread.inline.hpp"
  52 #include "runtime/vframe.hpp"
  53 #include "utilities/preserveException.hpp"
  54 
  55 #if INCLUDE_ALL_GCS
  56 #include "gc_implementation/shenandoah/shenandoahBarrierSet.hpp"
  57 #endif
  58 
  59 PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
  60 
  61 #define INJECTED_FIELD_COMPUTE_OFFSET(klass, name, signature, may_be_java)    \
  62   klass::_##name##_offset = JavaClasses::compute_injected_offset(JavaClasses::klass##_##name##_enum);
  63 
  64 #define DECLARE_INJECTED_FIELD(klass, name, signature, may_be_java)           \
  65   { SystemDictionary::WK_KLASS_ENUM_NAME(klass), vmSymbols::VM_SYMBOL_ENUM_NAME(name##_name), vmSymbols::VM_SYMBOL_ENUM_NAME(signature), may_be_java },
  66 
  67 InjectedField JavaClasses::_injected_fields[] = {
  68   ALL_INJECTED_FIELDS(DECLARE_INJECTED_FIELD)
  69 };
  70 
  71 int JavaClasses::compute_injected_offset(InjectedFieldID id) {
  72   return _injected_fields[id].compute_offset();
  73 }
  74 
  75 
  76 InjectedField* JavaClasses::get_injected(Symbol* class_name, int* field_count) {
  77   *field_count = 0;
  78 


1195 void java_lang_ThreadGroup::compute_offsets() {
1196   assert(_parent_offset == 0, "offsets should be initialized only once");
1197 
1198   Klass* k = SystemDictionary::ThreadGroup_klass();
1199 
1200   compute_offset(_parent_offset,      k, vmSymbols::parent_name(),      vmSymbols::threadgroup_signature());
1201   compute_offset(_name_offset,        k, vmSymbols::name_name(),        vmSymbols::string_signature());
1202   compute_offset(_threads_offset,     k, vmSymbols::threads_name(),     vmSymbols::thread_array_signature());
1203   compute_offset(_groups_offset,      k, vmSymbols::groups_name(),      vmSymbols::threadgroup_array_signature());
1204   compute_offset(_maxPriority_offset, k, vmSymbols::maxPriority_name(), vmSymbols::int_signature());
1205   compute_offset(_destroyed_offset,   k, vmSymbols::destroyed_name(),   vmSymbols::bool_signature());
1206   compute_offset(_daemon_offset,      k, vmSymbols::daemon_name(),      vmSymbols::bool_signature());
1207   compute_offset(_vmAllowSuspension_offset, k, vmSymbols::vmAllowSuspension_name(), vmSymbols::bool_signature());
1208   compute_offset(_nthreads_offset,    k, vmSymbols::nthreads_name(),    vmSymbols::int_signature());
1209   compute_offset(_ngroups_offset,     k, vmSymbols::ngroups_name(),     vmSymbols::int_signature());
1210 }
1211 
1212 oop java_lang_Throwable::unassigned_stacktrace() {
1213   InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::Throwable_klass());
1214   address addr = ik->static_field_addr(static_unassigned_stacktrace_offset);
1215   oop result;
1216   if (UseCompressedOops) {
1217     result = oopDesc::load_decode_heap_oop((narrowOop *)addr);
1218   } else {
1219     result = oopDesc::load_decode_heap_oop((oop*)addr);
1220   }
1221 #if INCLUDE_ALL_GCS
1222   if (UseShenandoahGC) {
1223     result = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(result);
1224   }
1225 #endif
1226   return result;
1227 }
1228 
1229 oop java_lang_Throwable::backtrace(oop throwable) {
1230   return throwable->obj_field_acquire(backtrace_offset);
1231 }
1232 
1233 
1234 void java_lang_Throwable::set_backtrace(oop throwable, oop value) {
1235   throwable->release_obj_field_put(backtrace_offset, value);
1236 }
1237 
1238 
1239 oop java_lang_Throwable::message(oop throwable) {
1240   return throwable->obj_field(detailMessage_offset);
1241 }
1242 
1243 
1244 oop java_lang_Throwable::message(Handle throwable) {
1245   return throwable->obj_field(detailMessage_offset);
1246 }


2642   case T_SHORT:     st->print("%d", value->s);                      break;
2643   case T_INT:       st->print("%d", value->i);                      break;
2644   case T_LONG:      st->print(INT64_FORMAT, value->j);              break;
2645   case T_FLOAT:     st->print("%f", value->f);                      break;
2646   case T_DOUBLE:    st->print("%lf", value->d);                     break;
2647   default:          st->print("type %d?", type);                    break;
2648   }
2649 }
2650 
2651 
2652 // Support for java_lang_ref_Reference
2653 HeapWord *java_lang_ref_Reference::pending_list_lock_addr() {
2654   InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::Reference_klass());
2655   address addr = ik->static_field_addr(static_lock_offset);
2656   return (HeapWord*) addr;
2657 }
2658 
2659 oop java_lang_ref_Reference::pending_list_lock() {
2660   InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::Reference_klass());
2661   address addr = ik->static_field_addr(static_lock_offset);
2662   oop result;
2663   if (UseCompressedOops) {
2664     result = oopDesc::load_decode_heap_oop((narrowOop *)addr);
2665   } else {
2666     result = oopDesc::load_decode_heap_oop((oop*)addr);
2667   }
2668 #if INCLUDE_ALL_GCS
2669   if (UseShenandoahGC) {
2670     result = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(result);
2671   }
2672 #endif
2673   return result;
2674 }
2675 
2676 HeapWord *java_lang_ref_Reference::pending_list_addr() {
2677   InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::Reference_klass());
2678   address addr = ik->static_field_addr(static_pending_offset);
2679   // XXX This might not be HeapWord aligned, almost rather be char *.
2680   return (HeapWord*)addr;
2681 }
2682 
2683 oop java_lang_ref_Reference::pending_list() {
2684   char *addr = (char *)pending_list_addr();
2685   oop result;
2686   if (UseCompressedOops) {
2687     result = oopDesc::load_decode_heap_oop((narrowOop *)addr);
2688   } else {
2689     result = oopDesc::load_decode_heap_oop((oop*)addr);
2690   }
2691 #if INCLUDE_ALL_GCS
2692   if (UseShenandoahGC) {
2693     result = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(result);
2694   }
2695 #endif
2696   return result;
2697 }
2698 
2699 
2700 // Support for java_lang_ref_SoftReference
2701 
2702 jlong java_lang_ref_SoftReference::timestamp(oop ref) {
2703   return ref->long_field(timestamp_offset);
2704 }
2705 
2706 jlong java_lang_ref_SoftReference::clock() {
2707   InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::SoftReference_klass());
2708   jlong* offset = (jlong*)ik->static_field_addr(static_clock_offset);
2709   return *offset;
2710 }
2711 
2712 void java_lang_ref_SoftReference::set_clock(jlong value) {
2713   InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::SoftReference_klass());
2714   jlong* offset = (jlong*)ik->static_field_addr(static_clock_offset);
2715   *offset = value;
2716 }


< prev index next >