hotspot/src/share/vm/classfile/systemDictionary.cpp
changeset 5882 6b2aecc4f7d8
parent 5547 f4b087cbb361
child 6062 bab93afe9df7
equal deleted inserted replaced
5708:e92b3d8118f1 5882:6b2aecc4f7d8
  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,