2452 // report back to the caller with the MethodType and the "on_bcp" flag |
2452 // report back to the caller with the MethodType and the "on_bcp" flag |
2453 return_bcp_flag = is_on_bcp; |
2453 return_bcp_flag = is_on_bcp; |
2454 return Handle(THREAD, (oop) result.get_jobject()); |
2454 return Handle(THREAD, (oop) result.get_jobject()); |
2455 } |
2455 } |
2456 |
2456 |
|
2457 // Ask Java code to find or construct a method handle constant. |
|
2458 Handle SystemDictionary::link_method_handle_constant(KlassHandle caller, |
|
2459 int ref_kind, //e.g., JVM_REF_invokeVirtual |
|
2460 KlassHandle callee, |
|
2461 symbolHandle name_sym, |
|
2462 symbolHandle signature, |
|
2463 TRAPS) { |
|
2464 Handle empty; |
|
2465 Handle name = java_lang_String::create_from_symbol(name_sym(), CHECK_(empty)); |
|
2466 Handle type; |
|
2467 if (signature->utf8_length() > 0 && signature->byte_at(0) == '(') { |
|
2468 bool ignore_is_on_bcp = false; |
|
2469 type = find_method_handle_type(signature, caller, ignore_is_on_bcp, CHECK_(empty)); |
|
2470 } else { |
|
2471 SignatureStream ss(signature(), false); |
|
2472 if (!ss.is_done()) { |
|
2473 oop mirror = ss.as_java_mirror(caller->class_loader(), caller->protection_domain(), |
|
2474 SignatureStream::NCDFError, CHECK_(empty)); |
|
2475 type = Handle(THREAD, mirror); |
|
2476 ss.next(); |
|
2477 if (!ss.is_done()) type = Handle(); // error! |
|
2478 } |
|
2479 } |
|
2480 if (type.is_null()) { |
|
2481 THROW_MSG_(vmSymbols::java_lang_LinkageError(), "bad signature", empty); |
|
2482 } |
|
2483 |
|
2484 // call sun.dyn.MethodHandleNatives::linkMethodHandleConstant(Class caller, int refKind, Class callee, String name, Object type) -> MethodHandle |
|
2485 JavaCallArguments args; |
|
2486 args.push_oop(caller->java_mirror()); // the referring class |
|
2487 args.push_int(ref_kind); |
|
2488 args.push_oop(callee->java_mirror()); // the target class |
|
2489 args.push_oop(name()); |
|
2490 args.push_oop(type()); |
|
2491 JavaValue result(T_OBJECT); |
|
2492 JavaCalls::call_static(&result, |
|
2493 SystemDictionary::MethodHandleNatives_klass(), |
|
2494 vmSymbols::linkMethodHandleConstant_name(), |
|
2495 vmSymbols::linkMethodHandleConstant_signature(), |
|
2496 &args, CHECK_(empty)); |
|
2497 return Handle(THREAD, (oop) result.get_jobject()); |
|
2498 } |
2457 |
2499 |
2458 // Ask Java code to find or construct a java.dyn.CallSite for the given |
2500 // Ask Java code to find or construct a java.dyn.CallSite for the given |
2459 // name and signature, as interpreted relative to the given class loader. |
2501 // name and signature, as interpreted relative to the given class loader. |
2460 Handle SystemDictionary::make_dynamic_call_site(Handle bootstrap_method, |
2502 Handle SystemDictionary::make_dynamic_call_site(Handle bootstrap_method, |
2461 symbolHandle name, |
2503 symbolHandle name, |