hotspot/src/share/vm/classfile/javaClasses.cpp
changeset 46505 fd4bc78630b1
parent 46388 d7a164ad6b7f
child 46619 a3919f5e8d2b
equal deleted inserted replaced
46504:38048d4d20e7 46505:fd4bc78630b1
    43 #include "oops/method.hpp"
    43 #include "oops/method.hpp"
    44 #include "oops/objArrayOop.inline.hpp"
    44 #include "oops/objArrayOop.inline.hpp"
    45 #include "oops/oop.inline.hpp"
    45 #include "oops/oop.inline.hpp"
    46 #include "oops/symbol.hpp"
    46 #include "oops/symbol.hpp"
    47 #include "oops/typeArrayOop.hpp"
    47 #include "oops/typeArrayOop.hpp"
       
    48 #include "prims/resolvedMethodTable.hpp"
    48 #include "runtime/fieldDescriptor.hpp"
    49 #include "runtime/fieldDescriptor.hpp"
    49 #include "runtime/handles.inline.hpp"
    50 #include "runtime/handles.inline.hpp"
    50 #include "runtime/interfaceSupport.hpp"
    51 #include "runtime/interfaceSupport.hpp"
    51 #include "runtime/java.hpp"
    52 #include "runtime/java.hpp"
    52 #include "runtime/javaCalls.hpp"
    53 #include "runtime/javaCalls.hpp"
  2226   // we should expand MemberName::name when Throwable uses StackTrace
  2227   // we should expand MemberName::name when Throwable uses StackTrace
  2227   // MethodHandles::expand_MemberName(mname, MethodHandles::_suppress_defc|MethodHandles::_suppress_type, CHECK_NULL);
  2228   // MethodHandles::expand_MemberName(mname, MethodHandles::_suppress_defc|MethodHandles::_suppress_type, CHECK_NULL);
  2228   return method;
  2229   return method;
  2229 }
  2230 }
  2230 
  2231 
  2231 void java_lang_StackFrameInfo::set_method_and_bci(Handle stackFrame, const methodHandle& method, int bci) {
  2232 void java_lang_StackFrameInfo::set_method_and_bci(Handle stackFrame, const methodHandle& method, int bci, TRAPS) {
  2232   // set Method* or mid/cpref
  2233   // set Method* or mid/cpref
  2233   Handle mname(Thread::current(), stackFrame->obj_field(_memberName_offset));
  2234   Handle mname(Thread::current(), stackFrame->obj_field(_memberName_offset));
  2234   InstanceKlass* ik = method->method_holder();
  2235   InstanceKlass* ik = method->method_holder();
  2235   CallInfo info(method(), ik);
  2236   CallInfo info(method(), ik, CHECK);
  2236   MethodHandles::init_method_MemberName(mname, info);
  2237   MethodHandles::init_method_MemberName(mname, info);
  2237   // set bci
  2238   // set bci
  2238   java_lang_StackFrameInfo::set_bci(stackFrame(), bci);
  2239   java_lang_StackFrameInfo::set_bci(stackFrame(), bci);
  2239   // method may be redefined; store the version
  2240   // method may be redefined; store the version
  2240   int version = method->constants()->version();
  2241   int version = method->constants()->version();
  3081   }
  3082   }
  3082   return member_name;
  3083   return member_name;
  3083 }
  3084 }
  3084 
  3085 
  3085 void java_lang_invoke_DirectMethodHandle::compute_offsets() {
  3086 void java_lang_invoke_DirectMethodHandle::compute_offsets() {
  3086   Klass* klass_oop = SystemDictionary::DirectMethodHandle_klass();
  3087   Klass* k = SystemDictionary::DirectMethodHandle_klass();
  3087   if (klass_oop != NULL) {
  3088   if (k != NULL) {
  3088     compute_offset(_member_offset, klass_oop, vmSymbols::member_name(), vmSymbols::java_lang_invoke_MemberName_signature());
  3089     compute_offset(_member_offset, k, vmSymbols::member_name(), vmSymbols::java_lang_invoke_MemberName_signature());
  3089   }
  3090   }
  3090 }
  3091 }
  3091 
  3092 
  3092 // Support for java_lang_invoke_MethodHandle
  3093 // Support for java_lang_invoke_MethodHandle
  3093 
  3094 
  3096 
  3097 
  3097 int java_lang_invoke_MemberName::_clazz_offset;
  3098 int java_lang_invoke_MemberName::_clazz_offset;
  3098 int java_lang_invoke_MemberName::_name_offset;
  3099 int java_lang_invoke_MemberName::_name_offset;
  3099 int java_lang_invoke_MemberName::_type_offset;
  3100 int java_lang_invoke_MemberName::_type_offset;
  3100 int java_lang_invoke_MemberName::_flags_offset;
  3101 int java_lang_invoke_MemberName::_flags_offset;
  3101 int java_lang_invoke_MemberName::_vmtarget_offset;
  3102 int java_lang_invoke_MemberName::_method_offset;
  3102 int java_lang_invoke_MemberName::_vmloader_offset;
       
  3103 int java_lang_invoke_MemberName::_vmindex_offset;
  3103 int java_lang_invoke_MemberName::_vmindex_offset;
  3104 
  3104 
       
  3105 int java_lang_invoke_ResolvedMethodName::_vmtarget_offset;
       
  3106 int java_lang_invoke_ResolvedMethodName::_vmholder_offset;
       
  3107 
  3105 int java_lang_invoke_LambdaForm::_vmentry_offset;
  3108 int java_lang_invoke_LambdaForm::_vmentry_offset;
  3106 
  3109 
  3107 void java_lang_invoke_MethodHandle::compute_offsets() {
  3110 void java_lang_invoke_MethodHandle::compute_offsets() {
  3108   Klass* klass_oop = SystemDictionary::MethodHandle_klass();
  3111   Klass* k = SystemDictionary::MethodHandle_klass();
  3109   if (klass_oop != NULL) {
  3112   if (k != NULL) {
  3110     compute_offset(_type_offset, klass_oop, vmSymbols::type_name(), vmSymbols::java_lang_invoke_MethodType_signature());
  3113     compute_offset(_type_offset, k, vmSymbols::type_name(), vmSymbols::java_lang_invoke_MethodType_signature());
  3111     compute_offset(_form_offset, klass_oop, vmSymbols::form_name(), vmSymbols::java_lang_invoke_LambdaForm_signature());
  3114     compute_offset(_form_offset, k, vmSymbols::form_name(), vmSymbols::java_lang_invoke_LambdaForm_signature());
  3112   }
  3115   }
  3113 }
  3116 }
  3114 
  3117 
  3115 void java_lang_invoke_MemberName::compute_offsets() {
  3118 void java_lang_invoke_MemberName::compute_offsets() {
  3116   Klass* klass_oop = SystemDictionary::MemberName_klass();
  3119   Klass* k = SystemDictionary::MemberName_klass();
  3117   if (klass_oop != NULL) {
  3120   assert (k != NULL, "jdk mismatch");
  3118     compute_offset(_clazz_offset,     klass_oop, vmSymbols::clazz_name(),     vmSymbols::class_signature());
  3121   compute_offset(_clazz_offset,   k, vmSymbols::clazz_name(),   vmSymbols::class_signature());
  3119     compute_offset(_name_offset,      klass_oop, vmSymbols::name_name(),      vmSymbols::string_signature());
  3122   compute_offset(_name_offset,    k, vmSymbols::name_name(),    vmSymbols::string_signature());
  3120     compute_offset(_type_offset,      klass_oop, vmSymbols::type_name(),      vmSymbols::object_signature());
  3123   compute_offset(_type_offset,    k, vmSymbols::type_name(),    vmSymbols::object_signature());
  3121     compute_offset(_flags_offset,     klass_oop, vmSymbols::flags_name(),     vmSymbols::int_signature());
  3124   compute_offset(_flags_offset,   k, vmSymbols::flags_name(),   vmSymbols::int_signature());
  3122     MEMBERNAME_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
  3125   compute_offset(_method_offset,  k, vmSymbols::method_name(),  vmSymbols::java_lang_invoke_ResolvedMethodName_signature());
  3123   }
  3126   MEMBERNAME_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
       
  3127 }
       
  3128 
       
  3129 void java_lang_invoke_ResolvedMethodName::compute_offsets() {
       
  3130   Klass* k = SystemDictionary::ResolvedMethodName_klass();
       
  3131   assert(k != NULL, "jdk mismatch");
       
  3132   RESOLVEDMETHOD_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
  3124 }
  3133 }
  3125 
  3134 
  3126 void java_lang_invoke_LambdaForm::compute_offsets() {
  3135 void java_lang_invoke_LambdaForm::compute_offsets() {
  3127   Klass* klass_oop = SystemDictionary::LambdaForm_klass();
  3136   Klass* k = SystemDictionary::LambdaForm_klass();
  3128   if (klass_oop != NULL) {
  3137   assert (k != NULL, "jdk mismatch");
  3129     compute_offset(_vmentry_offset, klass_oop, vmSymbols::vmentry_name(), vmSymbols::java_lang_invoke_MemberName_signature());
  3138   compute_offset(_vmentry_offset, k, vmSymbols::vmentry_name(), vmSymbols::java_lang_invoke_MemberName_signature());
  3130   }
       
  3131 }
  3139 }
  3132 
  3140 
  3133 bool java_lang_invoke_LambdaForm::is_instance(oop obj) {
  3141 bool java_lang_invoke_LambdaForm::is_instance(oop obj) {
  3134   return obj != NULL && is_subclass(obj->klass());
  3142   return obj != NULL && is_subclass(obj->klass());
  3135 }
  3143 }
  3193 void java_lang_invoke_MemberName::set_flags(oop mname, int flags) {
  3201 void java_lang_invoke_MemberName::set_flags(oop mname, int flags) {
  3194   assert(is_instance(mname), "wrong type");
  3202   assert(is_instance(mname), "wrong type");
  3195   mname->int_field_put(_flags_offset, flags);
  3203   mname->int_field_put(_flags_offset, flags);
  3196 }
  3204 }
  3197 
  3205 
  3198 Metadata* java_lang_invoke_MemberName::vmtarget(oop mname) {
  3206 
       
  3207 // Return vmtarget from ResolvedMethodName method field through indirection
       
  3208 Method* java_lang_invoke_MemberName::vmtarget(oop mname) {
  3199   assert(is_instance(mname), "wrong type");
  3209   assert(is_instance(mname), "wrong type");
  3200   return (Metadata*)mname->address_field(_vmtarget_offset);
  3210   oop method = mname->obj_field(_method_offset);
       
  3211   return method == NULL ? NULL : java_lang_invoke_ResolvedMethodName::vmtarget(method);
  3201 }
  3212 }
  3202 
  3213 
  3203 bool java_lang_invoke_MemberName::is_method(oop mname) {
  3214 bool java_lang_invoke_MemberName::is_method(oop mname) {
  3204   assert(is_instance(mname), "must be MemberName");
  3215   assert(is_instance(mname), "must be MemberName");
  3205   return (flags(mname) & (MN_IS_METHOD | MN_IS_CONSTRUCTOR)) > 0;
  3216   return (flags(mname) & (MN_IS_METHOD | MN_IS_CONSTRUCTOR)) > 0;
  3206 }
  3217 }
  3207 
  3218 
  3208 void java_lang_invoke_MemberName::set_vmtarget(oop mname, Metadata* ref) {
  3219 void java_lang_invoke_MemberName::set_method(oop mname, oop resolved_method) {
  3209   assert(is_instance(mname), "wrong type");
  3220   assert(is_instance(mname), "wrong type");
  3210   // check the type of the vmtarget
  3221   mname->obj_field_put(_method_offset, resolved_method);
  3211   oop dependency = NULL;
       
  3212   if (ref != NULL) {
       
  3213     switch (flags(mname) & (MN_IS_METHOD |
       
  3214                             MN_IS_CONSTRUCTOR |
       
  3215                             MN_IS_FIELD)) {
       
  3216     case MN_IS_METHOD:
       
  3217     case MN_IS_CONSTRUCTOR:
       
  3218       assert(ref->is_method(), "should be a method");
       
  3219       dependency = ((Method*)ref)->method_holder()->java_mirror();
       
  3220       break;
       
  3221     case MN_IS_FIELD:
       
  3222       assert(ref->is_klass(), "should be a class");
       
  3223       dependency = ((Klass*)ref)->java_mirror();
       
  3224       break;
       
  3225     default:
       
  3226       ShouldNotReachHere();
       
  3227     }
       
  3228   }
       
  3229   mname->address_field_put(_vmtarget_offset, (address)ref);
       
  3230   // Add a reference to the loader (actually mirror because anonymous classes will not have
       
  3231   // distinct loaders) to ensure the metadata is kept alive
       
  3232   // This mirror may be different than the one in clazz field.
       
  3233   mname->obj_field_put(_vmloader_offset, dependency);
       
  3234 }
  3222 }
  3235 
  3223 
  3236 intptr_t java_lang_invoke_MemberName::vmindex(oop mname) {
  3224 intptr_t java_lang_invoke_MemberName::vmindex(oop mname) {
  3237   assert(is_instance(mname), "wrong type");
  3225   assert(is_instance(mname), "wrong type");
  3238   return (intptr_t) mname->address_field(_vmindex_offset);
  3226   return (intptr_t) mname->address_field(_vmindex_offset);
  3241 void java_lang_invoke_MemberName::set_vmindex(oop mname, intptr_t index) {
  3229 void java_lang_invoke_MemberName::set_vmindex(oop mname, intptr_t index) {
  3242   assert(is_instance(mname), "wrong type");
  3230   assert(is_instance(mname), "wrong type");
  3243   mname->address_field_put(_vmindex_offset, (address) index);
  3231   mname->address_field_put(_vmindex_offset, (address) index);
  3244 }
  3232 }
  3245 
  3233 
  3246 bool java_lang_invoke_MemberName::equals(oop mn1, oop mn2) {
  3234 
  3247   if (mn1 == mn2) {
  3235 Method* java_lang_invoke_ResolvedMethodName::vmtarget(oop resolved_method) {
  3248      return true;
  3236   assert(is_instance(resolved_method), "wrong type");
  3249   }
  3237   Method* m = (Method*)resolved_method->address_field(_vmtarget_offset);
  3250   return (vmtarget(mn1) == vmtarget(mn2) && flags(mn1) == flags(mn2) &&
  3238   assert(m->is_method(), "must be");
  3251           vmindex(mn1) == vmindex(mn2) &&
  3239   return m;
  3252           clazz(mn1) == clazz(mn2));
  3240 }
       
  3241 
       
  3242 // Used by redefinition to change Method* to new Method* with same hash (name, signature)
       
  3243 void java_lang_invoke_ResolvedMethodName::set_vmtarget(oop resolved_method, Method* m) {
       
  3244   assert(is_instance(resolved_method), "wrong type");
       
  3245   resolved_method->address_field_put(_vmtarget_offset, (address)m);
       
  3246 }
       
  3247 
       
  3248 oop java_lang_invoke_ResolvedMethodName::find_resolved_method(const methodHandle& m, TRAPS) {
       
  3249   // lookup ResolvedMethod oop in the table, or create a new one and intern it
       
  3250   oop resolved_method = ResolvedMethodTable::find_method(m());
       
  3251   if (resolved_method == NULL) {
       
  3252     InstanceKlass* k = SystemDictionary::ResolvedMethodName_klass();
       
  3253     if (!k->is_initialized()) {
       
  3254       k->initialize(CHECK_NULL);
       
  3255     }
       
  3256     oop new_resolved_method = k->allocate_instance(CHECK_NULL);
       
  3257     new_resolved_method->address_field_put(_vmtarget_offset, (address)m());
       
  3258     // Add a reference to the loader (actually mirror because anonymous classes will not have
       
  3259     // distinct loaders) to ensure the metadata is kept alive.
       
  3260     // This mirror may be different than the one in clazz field.
       
  3261     new_resolved_method->obj_field_put(_vmholder_offset, m->method_holder()->java_mirror());
       
  3262     resolved_method = ResolvedMethodTable::add_method(Handle(THREAD, new_resolved_method));
       
  3263   }
       
  3264   return resolved_method;
  3253 }
  3265 }
  3254 
  3266 
  3255 oop java_lang_invoke_LambdaForm::vmentry(oop lform) {
  3267 oop java_lang_invoke_LambdaForm::vmentry(oop lform) {
  3256   assert(is_instance(lform), "wrong type");
  3268   assert(is_instance(lform), "wrong type");
  3257   return lform->obj_field(_vmentry_offset);
  3269   return lform->obj_field(_vmentry_offset);
  3854   java_lang_Thread::compute_offsets();
  3866   java_lang_Thread::compute_offsets();
  3855   java_lang_ThreadGroup::compute_offsets();
  3867   java_lang_ThreadGroup::compute_offsets();
  3856   java_lang_invoke_MethodHandle::compute_offsets();
  3868   java_lang_invoke_MethodHandle::compute_offsets();
  3857   java_lang_invoke_DirectMethodHandle::compute_offsets();
  3869   java_lang_invoke_DirectMethodHandle::compute_offsets();
  3858   java_lang_invoke_MemberName::compute_offsets();
  3870   java_lang_invoke_MemberName::compute_offsets();
       
  3871   java_lang_invoke_ResolvedMethodName::compute_offsets();
  3859   java_lang_invoke_LambdaForm::compute_offsets();
  3872   java_lang_invoke_LambdaForm::compute_offsets();
  3860   java_lang_invoke_MethodType::compute_offsets();
  3873   java_lang_invoke_MethodType::compute_offsets();
  3861   java_lang_invoke_CallSite::compute_offsets();
  3874   java_lang_invoke_CallSite::compute_offsets();
  3862   java_lang_invoke_MethodHandleNatives_CallSiteContext::compute_offsets();
  3875   java_lang_invoke_MethodHandleNatives_CallSiteContext::compute_offsets();
  3863   java_security_AccessControlContext::compute_offsets();
  3876   java_security_AccessControlContext::compute_offsets();