hotspot/src/share/vm/classfile/javaClasses.cpp
changeset 30296 95baefac8485
parent 29081 c61eb4914428
child 30310 522ea430079f
equal deleted inserted replaced
30226:5f1a3a275862 30296:95baefac8485
   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:");
  2970 
  2971 
  2971 
  2972 
  2972 // Support for java_lang_invoke_CallSite
  2973 // Support for java_lang_invoke_CallSite
  2973 
  2974 
  2974 int java_lang_invoke_CallSite::_target_offset;
  2975 int java_lang_invoke_CallSite::_target_offset;
       
  2976 int java_lang_invoke_CallSite::_context_offset;
       
  2977 int java_lang_invoke_CallSite::_default_context_offset;
  2975 
  2978 
  2976 void java_lang_invoke_CallSite::compute_offsets() {
  2979 void java_lang_invoke_CallSite::compute_offsets() {
  2977   Klass* k = SystemDictionary::CallSite_klass();
  2980   Klass* k = SystemDictionary::CallSite_klass();
  2978   if (k != NULL) {
  2981   if (k != NULL) {
  2979     compute_offset(_target_offset, k, vmSymbols::target_name(), vmSymbols::java_lang_invoke_MethodHandle_signature());
  2982     compute_offset(_target_offset, k, vmSymbols::target_name(), vmSymbols::java_lang_invoke_MethodHandle_signature());
  2980   }
  2983     compute_offset(_context_offset, k, vmSymbols::context_name(), vmSymbols::sun_misc_Cleaner_signature());
  2981 }
  2984     compute_offset(_default_context_offset, k,
  2982 
  2985                    vmSymbols::DEFAULT_CONTEXT_name(), vmSymbols::sun_misc_Cleaner_signature(),
       
  2986                    /*is_static=*/true, /*allow_super=*/false);
       
  2987   }
       
  2988 }
       
  2989 
       
  2990 oop java_lang_invoke_CallSite::context_volatile(oop call_site) {
       
  2991   assert(java_lang_invoke_CallSite::is_instance(call_site), "");
       
  2992 
       
  2993   oop dep_oop = call_site->obj_field_volatile(_context_offset);
       
  2994   return dep_oop;
       
  2995 }
       
  2996 
       
  2997 void java_lang_invoke_CallSite::set_context_volatile(oop call_site, oop context) {
       
  2998   assert(java_lang_invoke_CallSite::is_instance(call_site), "");
       
  2999   call_site->obj_field_put_volatile(_context_offset, context);
       
  3000 }
       
  3001 
       
  3002 bool java_lang_invoke_CallSite::set_context_cas(oop call_site, oop context, oop expected) {
       
  3003   assert(java_lang_invoke_CallSite::is_instance(call_site), "");
       
  3004   HeapWord* context_addr = call_site->obj_field_addr<HeapWord>(_context_offset);
       
  3005   oop res = oopDesc::atomic_compare_exchange_oop(context, context_addr, expected, true);
       
  3006   bool success = (res == expected);
       
  3007   if (success) {
       
  3008     update_barrier_set((void*)context_addr, context);
       
  3009   }
       
  3010   return success;
       
  3011 }
       
  3012 
       
  3013 oop java_lang_invoke_CallSite::default_context() {
       
  3014   InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::CallSite_klass());
       
  3015   oop def_context_oop = ik->java_mirror()->obj_field(_default_context_offset);
       
  3016   assert(!oopDesc::is_null(def_context_oop), "");
       
  3017   return def_context_oop;
       
  3018 }
  2983 
  3019 
  2984 // Support for java_security_AccessControlContext
  3020 // Support for java_security_AccessControlContext
  2985 
  3021 
  2986 int java_security_AccessControlContext::_context_offset = 0;
  3022 int java_security_AccessControlContext::_context_offset = 0;
  2987 int java_security_AccessControlContext::_privilegedContext_offset = 0;
  3023 int java_security_AccessControlContext::_privilegedContext_offset = 0;