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