hotspot/src/share/vm/classfile/systemDictionary.cpp
changeset 8676 9098d4e927e1
parent 8675 e9fef2a9bef7
child 8883 5569135acca3
equal deleted inserted replaced
8675:e9fef2a9bef7 8676:9098d4e927e1
  2448   } else {
  2448   } else {
  2449     return non_cached_result();
  2449     return non_cached_result();
  2450   }
  2450   }
  2451 }
  2451 }
  2452 
  2452 
  2453 // Ask Java code to find or construct a java.dyn.MethodType for the given
  2453 // Ask Java code to find or construct a java.lang.invoke.MethodType for the given
  2454 // signature, as interpreted relative to the given class loader.
  2454 // signature, as interpreted relative to the given class loader.
  2455 // Because of class loader constraints, all method handle usage must be
  2455 // Because of class loader constraints, all method handle usage must be
  2456 // consistent with this loader.
  2456 // consistent with this loader.
  2457 Handle SystemDictionary::find_method_handle_type(Symbol* signature,
  2457 Handle SystemDictionary::find_method_handle_type(Symbol* signature,
  2458                                                  KlassHandle accessing_klass,
  2458                                                  KlassHandle accessing_klass,
  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();