2502 } |
2502 } |
2503 } |
2503 } |
2504 } |
2504 } |
2505 assert(arg == npts, ""); |
2505 assert(arg == npts, ""); |
2506 |
2506 |
2507 // call sun.dyn.MethodHandleNatives::findMethodType(Class rt, Class[] pts) -> MethodType |
2507 // call java.lang.invoke.MethodHandleNatives::findMethodType(Class rt, Class[] pts) -> MethodType |
2508 JavaCallArguments args(Handle(THREAD, rt())); |
2508 JavaCallArguments args(Handle(THREAD, rt())); |
2509 args.push_oop(pts()); |
2509 args.push_oop(pts()); |
2510 JavaValue result(T_OBJECT); |
2510 JavaValue result(T_OBJECT); |
|
2511 Symbol* findMethodHandleType_signature = vmSymbols::findMethodHandleType_signature(); |
|
2512 if (AllowTransitionalJSR292 && SystemDictionaryHandles::MethodType_klass()->name() == vmSymbols::java_dyn_MethodType()) { |
|
2513 findMethodHandleType_signature = vmSymbols::findMethodHandleType_TRANS_signature(); |
|
2514 } |
2511 JavaCalls::call_static(&result, |
2515 JavaCalls::call_static(&result, |
2512 SystemDictionary::MethodHandleNatives_klass(), |
2516 SystemDictionary::MethodHandleNatives_klass(), |
2513 vmSymbols::findMethodHandleType_name(), |
2517 vmSymbols::findMethodHandleType_name(), |
2514 vmSymbols::findMethodHandleType_signature(), |
2518 findMethodHandleType_signature, |
2515 &args, CHECK_(empty)); |
2519 &args, CHECK_(empty)); |
2516 Handle method_type(THREAD, (oop) result.get_jobject()); |
2520 Handle method_type(THREAD, (oop) result.get_jobject()); |
2517 |
2521 |
2518 if (for_invokeGeneric) { |
2522 if (for_invokeGeneric) { |
2519 // call sun.dyn.MethodHandleNatives::notifyGenericMethodType(MethodType) -> void |
2523 // call java.lang.invoke.MethodHandleNatives::notifyGenericMethodType(MethodType) -> void |
2520 JavaCallArguments args(Handle(THREAD, method_type())); |
2524 JavaCallArguments args(Handle(THREAD, method_type())); |
2521 JavaValue no_result(T_VOID); |
2525 JavaValue no_result(T_VOID); |
|
2526 Symbol* notifyGenericMethodType_signature = vmSymbols::notifyGenericMethodType_signature(); |
|
2527 if (AllowTransitionalJSR292 && SystemDictionaryHandles::MethodType_klass()->name() == vmSymbols::java_dyn_MethodType()) { |
|
2528 notifyGenericMethodType_signature = vmSymbols::notifyGenericMethodType_TRANS_signature(); |
|
2529 } |
2522 JavaCalls::call_static(&no_result, |
2530 JavaCalls::call_static(&no_result, |
2523 SystemDictionary::MethodHandleNatives_klass(), |
2531 SystemDictionary::MethodHandleNatives_klass(), |
2524 vmSymbols::notifyGenericMethodType_name(), |
2532 vmSymbols::notifyGenericMethodType_name(), |
2525 vmSymbols::notifyGenericMethodType_signature(), |
2533 notifyGenericMethodType_signature, |
2526 &args, THREAD); |
2534 &args, THREAD); |
2527 if (HAS_PENDING_EXCEPTION) { |
2535 if (HAS_PENDING_EXCEPTION) { |
2528 // If the notification fails, just kill it. |
2536 // If the notification fails, just kill it. |
2529 CLEAR_PENDING_EXCEPTION; |
2537 CLEAR_PENDING_EXCEPTION; |
2530 } |
2538 } |
2561 } |
2569 } |
2562 if (type.is_null()) { |
2570 if (type.is_null()) { |
2563 THROW_MSG_(vmSymbols::java_lang_LinkageError(), "bad signature", empty); |
2571 THROW_MSG_(vmSymbols::java_lang_LinkageError(), "bad signature", empty); |
2564 } |
2572 } |
2565 |
2573 |
2566 // call sun.dyn.MethodHandleNatives::linkMethodHandleConstant(Class caller, int refKind, Class callee, String name, Object type) -> MethodHandle |
2574 // call java.lang.invoke.MethodHandleNatives::linkMethodHandleConstant(Class caller, int refKind, Class callee, String name, Object type) -> MethodHandle |
2567 JavaCallArguments args; |
2575 JavaCallArguments args; |
2568 args.push_oop(caller->java_mirror()); // the referring class |
2576 args.push_oop(caller->java_mirror()); // the referring class |
2569 args.push_int(ref_kind); |
2577 args.push_int(ref_kind); |
2570 args.push_oop(callee->java_mirror()); // the target class |
2578 args.push_oop(callee->java_mirror()); // the target class |
2571 args.push_oop(name()); |
2579 args.push_oop(name()); |
2572 args.push_oop(type()); |
2580 args.push_oop(type()); |
2573 JavaValue result(T_OBJECT); |
2581 JavaValue result(T_OBJECT); |
|
2582 Symbol* linkMethodHandleConstant_signature = vmSymbols::linkMethodHandleConstant_signature(); |
|
2583 if (AllowTransitionalJSR292 && SystemDictionaryHandles::MethodHandle_klass()->name() == vmSymbols::java_dyn_MethodHandle()) { |
|
2584 linkMethodHandleConstant_signature = vmSymbols::linkMethodHandleConstant_TRANS_signature(); |
|
2585 } |
2574 JavaCalls::call_static(&result, |
2586 JavaCalls::call_static(&result, |
2575 SystemDictionary::MethodHandleNatives_klass(), |
2587 SystemDictionary::MethodHandleNatives_klass(), |
2576 vmSymbols::linkMethodHandleConstant_name(), |
2588 vmSymbols::linkMethodHandleConstant_name(), |
2577 vmSymbols::linkMethodHandleConstant_signature(), |
2589 linkMethodHandleConstant_signature, |
2578 &args, CHECK_(empty)); |
2590 &args, CHECK_(empty)); |
2579 return Handle(THREAD, (oop) result.get_jobject()); |
2591 return Handle(THREAD, (oop) result.get_jobject()); |
2580 } |
2592 } |
2581 |
2593 |
2582 // Ask Java code to find or construct a java.dyn.CallSite for the given |
2594 // Ask Java code to find or construct a java.lang.invoke.CallSite for the given |
2583 // name and signature, as interpreted relative to the given class loader. |
2595 // name and signature, as interpreted relative to the given class loader. |
2584 Handle SystemDictionary::make_dynamic_call_site(Handle bootstrap_method, |
2596 Handle SystemDictionary::make_dynamic_call_site(Handle bootstrap_method, |
2585 Symbol* name, |
2597 Symbol* name, |
2586 methodHandle signature_invoker, |
2598 methodHandle signature_invoker, |
2587 Handle info, |
2599 Handle info, |
2588 methodHandle caller_method, |
2600 methodHandle caller_method, |
2589 int caller_bci, |
2601 int caller_bci, |
2590 TRAPS) { |
2602 TRAPS) { |
2591 Handle empty; |
2603 Handle empty; |
2592 guarantee(bootstrap_method.not_null() && |
2604 guarantee(bootstrap_method.not_null() && |
2593 java_dyn_MethodHandle::is_instance(bootstrap_method()), |
2605 java_lang_invoke_MethodHandle::is_instance(bootstrap_method()), |
2594 "caller must supply a valid BSM"); |
2606 "caller must supply a valid BSM"); |
2595 |
2607 |
2596 Handle caller_mname = MethodHandles::new_MemberName(CHECK_(empty)); |
2608 Handle caller_mname = MethodHandles::new_MemberName(CHECK_(empty)); |
2597 MethodHandles::init_MemberName(caller_mname(), caller_method()); |
2609 MethodHandles::init_MemberName(caller_mname(), caller_method()); |
2598 |
2610 |
2599 // call sun.dyn.MethodHandleNatives::makeDynamicCallSite(bootm, name, mtype, info, caller_mname, caller_pos) |
2611 // call java.lang.invoke.MethodHandleNatives::makeDynamicCallSite(bootm, name, mtype, info, caller_mname, caller_pos) |
2600 oop name_str_oop = StringTable::intern(name, CHECK_(empty)); // not a handle! |
2612 oop name_str_oop = StringTable::intern(name, CHECK_(empty)); // not a handle! |
2601 JavaCallArguments args(Handle(THREAD, bootstrap_method())); |
2613 JavaCallArguments args(Handle(THREAD, bootstrap_method())); |
2602 args.push_oop(name_str_oop); |
2614 args.push_oop(name_str_oop); |
2603 args.push_oop(signature_invoker->method_handle_type()); |
2615 args.push_oop(signature_invoker->method_handle_type()); |
2604 args.push_oop(info()); |
2616 args.push_oop(info()); |
2607 JavaValue result(T_OBJECT); |
2619 JavaValue result(T_OBJECT); |
2608 Symbol* makeDynamicCallSite_signature = vmSymbols::makeDynamicCallSite_signature(); |
2620 Symbol* makeDynamicCallSite_signature = vmSymbols::makeDynamicCallSite_signature(); |
2609 if (AllowTransitionalJSR292 && SystemDictionaryHandles::MethodHandleNatives_klass()->name() == vmSymbols::sun_dyn_MethodHandleNatives()) { |
2621 if (AllowTransitionalJSR292 && SystemDictionaryHandles::MethodHandleNatives_klass()->name() == vmSymbols::sun_dyn_MethodHandleNatives()) { |
2610 makeDynamicCallSite_signature = vmSymbols::makeDynamicCallSite_TRANS_signature(); |
2622 makeDynamicCallSite_signature = vmSymbols::makeDynamicCallSite_TRANS_signature(); |
2611 } |
2623 } |
|
2624 if (AllowTransitionalJSR292 && SystemDictionaryHandles::MethodHandleNatives_klass()->name() == vmSymbols::java_dyn_MethodHandleNatives()) { |
|
2625 makeDynamicCallSite_signature = vmSymbols::makeDynamicCallSite_TRANS2_signature(); |
|
2626 } |
2612 JavaCalls::call_static(&result, |
2627 JavaCalls::call_static(&result, |
2613 SystemDictionary::MethodHandleNatives_klass(), |
2628 SystemDictionary::MethodHandleNatives_klass(), |
2614 vmSymbols::makeDynamicCallSite_name(), |
2629 vmSymbols::makeDynamicCallSite_name(), |
2615 makeDynamicCallSite_signature, |
2630 makeDynamicCallSite_signature, |
2616 &args, CHECK_(empty)); |
2631 &args, CHECK_(empty)); |
2617 oop call_site_oop = (oop) result.get_jobject(); |
2632 oop call_site_oop = (oop) result.get_jobject(); |
2618 assert(call_site_oop->is_oop() |
2633 assert(call_site_oop->is_oop() |
2619 /*&& java_dyn_CallSite::is_instance(call_site_oop)*/, "must be sane"); |
2634 /*&& java_lang_invoke_CallSite::is_instance(call_site_oop)*/, "must be sane"); |
2620 if (TraceMethodHandles) { |
2635 if (TraceMethodHandles) { |
2621 #ifndef PRODUCT |
2636 #ifndef PRODUCT |
2622 tty->print_cr("Linked invokedynamic bci=%d site="INTPTR_FORMAT":", caller_bci, call_site_oop); |
2637 tty->print_cr("Linked invokedynamic bci=%d site="INTPTR_FORMAT":", caller_bci, call_site_oop); |
2623 call_site_oop->print(); |
2638 call_site_oop->print(); |
2624 tty->cr(); |
2639 tty->cr(); |