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; |