2403 } |
2403 } |
2404 THROW_MSG_(vmSymbols::java_lang_LinkageError(), "bad value from MethodHandleNatives", empty); |
2404 THROW_MSG_(vmSymbols::java_lang_LinkageError(), "bad value from MethodHandleNatives", empty); |
2405 return empty; |
2405 return empty; |
2406 } |
2406 } |
2407 |
2407 |
2408 methodHandle SystemDictionary::find_method_handle_invoker(Symbol* name, |
2408 methodHandle SystemDictionary::find_method_handle_invoker(KlassHandle klass, |
|
2409 Symbol* name, |
2409 Symbol* signature, |
2410 Symbol* signature, |
2410 KlassHandle accessing_klass, |
2411 KlassHandle accessing_klass, |
2411 Handle *appendix_result, |
2412 Handle *appendix_result, |
2412 Handle *method_type_result, |
2413 Handle *method_type_result, |
2413 TRAPS) { |
2414 TRAPS) { |
2414 methodHandle empty; |
2415 methodHandle empty; |
2415 assert(THREAD->can_call_java() ,""); |
2416 assert(THREAD->can_call_java() ,""); |
2416 Handle method_type = |
2417 Handle method_type = |
2417 SystemDictionary::find_method_handle_type(signature, accessing_klass, CHECK_(empty)); |
2418 SystemDictionary::find_method_handle_type(signature, accessing_klass, CHECK_(empty)); |
2418 |
2419 |
2419 KlassHandle mh_klass = SystemDictionary::MethodHandle_klass(); |
|
2420 int ref_kind = JVM_REF_invokeVirtual; |
2420 int ref_kind = JVM_REF_invokeVirtual; |
2421 Handle name_str = StringTable::intern(name, CHECK_(empty)); |
2421 Handle name_str = StringTable::intern(name, CHECK_(empty)); |
2422 objArrayHandle appendix_box = oopFactory::new_objArray(SystemDictionary::Object_klass(), 1, CHECK_(empty)); |
2422 objArrayHandle appendix_box = oopFactory::new_objArray(SystemDictionary::Object_klass(), 1, CHECK_(empty)); |
2423 assert(appendix_box->obj_at(0) == NULL, ""); |
2423 assert(appendix_box->obj_at(0) == NULL, ""); |
2424 |
2424 |
2429 |
2429 |
2430 // call java.lang.invoke.MethodHandleNatives::linkMethod(... String, MethodType) -> MemberName |
2430 // call java.lang.invoke.MethodHandleNatives::linkMethod(... String, MethodType) -> MemberName |
2431 JavaCallArguments args; |
2431 JavaCallArguments args; |
2432 args.push_oop(accessing_klass()->java_mirror()); |
2432 args.push_oop(accessing_klass()->java_mirror()); |
2433 args.push_int(ref_kind); |
2433 args.push_int(ref_kind); |
2434 args.push_oop(mh_klass()->java_mirror()); |
2434 args.push_oop(klass()->java_mirror()); |
2435 args.push_oop(name_str()); |
2435 args.push_oop(name_str()); |
2436 args.push_oop(method_type()); |
2436 args.push_oop(method_type()); |
2437 args.push_oop(appendix_box()); |
2437 args.push_oop(appendix_box()); |
2438 JavaValue result(T_OBJECT); |
2438 JavaValue result(T_OBJECT); |
2439 JavaCalls::call_static(&result, |
2439 JavaCalls::call_static(&result, |