hotspot/src/share/vm/classfile/javaClasses.cpp
changeset 30310 522ea430079f
parent 30289 10b7b61d759a
parent 30296 95baefac8485
child 31037 01a5c5fa5681
equal deleted inserted replaced
30294:e16e14bd116a 30310:522ea430079f
   100 
   100 
   101 
   101 
   102 static bool find_field(InstanceKlass* ik,
   102 static bool find_field(InstanceKlass* ik,
   103                        Symbol* name_symbol, Symbol* signature_symbol,
   103                        Symbol* name_symbol, Symbol* signature_symbol,
   104                        fieldDescriptor* fd,
   104                        fieldDescriptor* fd,
   105                        bool allow_super = false) {
   105                        bool is_static = false, bool allow_super = false) {
   106   if (allow_super)
   106   if (allow_super || is_static) {
   107     return ik->find_field(name_symbol, signature_symbol, fd) != NULL;
   107     return ik->find_field(name_symbol, signature_symbol, is_static, fd) != NULL;
   108   else
   108   } else {
   109     return ik->find_local_field(name_symbol, signature_symbol, fd);
   109     return ik->find_local_field(name_symbol, signature_symbol, fd);
       
   110   }
   110 }
   111 }
   111 
   112 
   112 // Helpful routine for computing field offsets at run time rather than hardcoding them
   113 // Helpful routine for computing field offsets at run time rather than hardcoding them
   113 static void
   114 static void
   114 compute_offset(int &dest_offset,
   115 compute_offset(int &dest_offset,
   115                Klass* klass_oop, Symbol* name_symbol, Symbol* signature_symbol,
   116                Klass* klass_oop, Symbol* name_symbol, Symbol* signature_symbol,
   116                bool allow_super = false) {
   117                bool is_static = false, bool allow_super = false) {
   117   fieldDescriptor fd;
   118   fieldDescriptor fd;
   118   InstanceKlass* ik = InstanceKlass::cast(klass_oop);
   119   InstanceKlass* ik = InstanceKlass::cast(klass_oop);
   119   if (!find_field(ik, name_symbol, signature_symbol, &fd, allow_super)) {
   120   if (!find_field(ik, name_symbol, signature_symbol, &fd, is_static, allow_super)) {
   120     ResourceMark rm;
   121     ResourceMark rm;
   121     tty->print_cr("Invalid layout of %s at %s", ik->external_name(), name_symbol->as_C_string());
   122     tty->print_cr("Invalid layout of %s at %s", ik->external_name(), name_symbol->as_C_string());
   122 #ifndef PRODUCT
   123 #ifndef PRODUCT
   123     klass_oop->print();
   124     klass_oop->print();
   124     tty->print_cr("all fields:");
   125     tty->print_cr("all fields:");
  2963 
  2964 
  2964 
  2965 
  2965 // Support for java_lang_invoke_CallSite
  2966 // Support for java_lang_invoke_CallSite
  2966 
  2967 
  2967 int java_lang_invoke_CallSite::_target_offset;
  2968 int java_lang_invoke_CallSite::_target_offset;
       
  2969 int java_lang_invoke_CallSite::_context_offset;
       
  2970 int java_lang_invoke_CallSite::_default_context_offset;
  2968 
  2971 
  2969 void java_lang_invoke_CallSite::compute_offsets() {
  2972 void java_lang_invoke_CallSite::compute_offsets() {
  2970   Klass* k = SystemDictionary::CallSite_klass();
  2973   Klass* k = SystemDictionary::CallSite_klass();
  2971   if (k != NULL) {
  2974   if (k != NULL) {
  2972     compute_offset(_target_offset, k, vmSymbols::target_name(), vmSymbols::java_lang_invoke_MethodHandle_signature());
  2975     compute_offset(_target_offset, k, vmSymbols::target_name(), vmSymbols::java_lang_invoke_MethodHandle_signature());
  2973   }
  2976     compute_offset(_context_offset, k, vmSymbols::context_name(), vmSymbols::sun_misc_Cleaner_signature());
  2974 }
  2977     compute_offset(_default_context_offset, k,
  2975 
  2978                    vmSymbols::DEFAULT_CONTEXT_name(), vmSymbols::sun_misc_Cleaner_signature(),
       
  2979                    /*is_static=*/true, /*allow_super=*/false);
       
  2980   }
       
  2981 }
       
  2982 
       
  2983 oop java_lang_invoke_CallSite::context_volatile(oop call_site) {
       
  2984   assert(java_lang_invoke_CallSite::is_instance(call_site), "");
       
  2985 
       
  2986   oop dep_oop = call_site->obj_field_volatile(_context_offset);
       
  2987   return dep_oop;
       
  2988 }
       
  2989 
       
  2990 void java_lang_invoke_CallSite::set_context_volatile(oop call_site, oop context) {
       
  2991   assert(java_lang_invoke_CallSite::is_instance(call_site), "");
       
  2992   call_site->obj_field_put_volatile(_context_offset, context);
       
  2993 }
       
  2994 
       
  2995 bool java_lang_invoke_CallSite::set_context_cas(oop call_site, oop context, oop expected) {
       
  2996   assert(java_lang_invoke_CallSite::is_instance(call_site), "");
       
  2997   HeapWord* context_addr = call_site->obj_field_addr<HeapWord>(_context_offset);
       
  2998   oop res = oopDesc::atomic_compare_exchange_oop(context, context_addr, expected, true);
       
  2999   bool success = (res == expected);
       
  3000   if (success) {
       
  3001     update_barrier_set((void*)context_addr, context);
       
  3002   }
       
  3003   return success;
       
  3004 }
       
  3005 
       
  3006 oop java_lang_invoke_CallSite::default_context() {
       
  3007   InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::CallSite_klass());
       
  3008   oop def_context_oop = ik->java_mirror()->obj_field(_default_context_offset);
       
  3009   assert(!oopDesc::is_null(def_context_oop), "");
       
  3010   return def_context_oop;
       
  3011 }
  2976 
  3012 
  2977 // Support for java_security_AccessControlContext
  3013 // Support for java_security_AccessControlContext
  2978 
  3014 
  2979 int java_security_AccessControlContext::_context_offset = 0;
  3015 int java_security_AccessControlContext::_context_offset = 0;
  2980 int java_security_AccessControlContext::_privilegedContext_offset = 0;
  3016 int java_security_AccessControlContext::_privilegedContext_offset = 0;