hotspot/src/share/vm/interpreter/linkResolver.cpp
changeset 5420 586d3988e72b
parent 4571 80b553bddc26
child 5421 e294db54fc0d
equal deleted inserted replaced
5419:f2e8cc8c12ea 5420:586d3988e72b
   136 //
   136 //
   137 // According to JVM spec. $5.4.3c & $5.4.3d
   137 // According to JVM spec. $5.4.3c & $5.4.3d
   138 
   138 
   139 void LinkResolver::lookup_method_in_klasses(methodHandle& result, KlassHandle klass, symbolHandle name, symbolHandle signature, TRAPS) {
   139 void LinkResolver::lookup_method_in_klasses(methodHandle& result, KlassHandle klass, symbolHandle name, symbolHandle signature, TRAPS) {
   140   methodOop result_oop = klass->uncached_lookup_method(name(), signature());
   140   methodOop result_oop = klass->uncached_lookup_method(name(), signature());
       
   141   if (EnableMethodHandles && result_oop != NULL) {
       
   142     switch (result_oop->intrinsic_id()) {
       
   143     case vmIntrinsics::_invokeExact:
       
   144     case vmIntrinsics::_invokeGeneric:
       
   145     case vmIntrinsics::_invokeDynamic:
       
   146       // Do not link directly to these.  The VM must produce a synthetic one using lookup_implicit_method.
       
   147       return;
       
   148     }
       
   149   }
   141   result = methodHandle(THREAD, result_oop);
   150   result = methodHandle(THREAD, result_oop);
   142 }
   151 }
   143 
   152 
   144 // returns first instance method
   153 // returns first instance method
   145 void LinkResolver::lookup_instance_method_in_klasses(methodHandle& result, KlassHandle klass, symbolHandle name, symbolHandle signature, TRAPS) {
   154 void LinkResolver::lookup_instance_method_in_klasses(methodHandle& result, KlassHandle klass, symbolHandle name, symbolHandle signature, TRAPS) {
   163   result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name(), signature()));
   172   result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name(), signature()));
   164 }
   173 }
   165 
   174 
   166 void LinkResolver::lookup_implicit_method(methodHandle& result, KlassHandle klass, symbolHandle name, symbolHandle signature, TRAPS) {
   175 void LinkResolver::lookup_implicit_method(methodHandle& result, KlassHandle klass, symbolHandle name, symbolHandle signature, TRAPS) {
   167   if (EnableMethodHandles && MethodHandles::enabled() &&
   176   if (EnableMethodHandles && MethodHandles::enabled() &&
   168       name == vmSymbolHandles::invoke_name() && klass() == SystemDictionary::MethodHandle_klass()) {
   177       klass() == SystemDictionary::MethodHandle_klass() &&
   169     methodOop result_oop = SystemDictionary::find_method_handle_invoke(signature,
   178       methodOopDesc::is_method_handle_invoke_name(name())) {
       
   179     methodOop result_oop = SystemDictionary::find_method_handle_invoke(name,
       
   180                                                                        signature,
   170                                                                        Handle(),
   181                                                                        Handle(),
   171                                                                        Handle(),
   182                                                                        Handle(),
   172                                                                        CHECK);
   183                                                                        CHECK);
   173     if (result_oop != NULL) {
   184     if (result_oop != NULL) {
   174       assert(result_oop->is_method_handle_invoke() && result_oop->signature() == signature(), "consistent");
   185       assert(result_oop->is_method_handle_invoke() && result_oop->signature() == signature(), "consistent");
   237 
   248 
   238 void LinkResolver::resolve_dynamic_method(methodHandle& resolved_method, KlassHandle& resolved_klass, constantPoolHandle pool, int index, TRAPS) {
   249 void LinkResolver::resolve_dynamic_method(methodHandle& resolved_method, KlassHandle& resolved_klass, constantPoolHandle pool, int index, TRAPS) {
   239   // The class is java.dyn.MethodHandle
   250   // The class is java.dyn.MethodHandle
   240   resolved_klass = SystemDictionaryHandles::MethodHandle_klass();
   251   resolved_klass = SystemDictionaryHandles::MethodHandle_klass();
   241 
   252 
   242   symbolHandle method_name = vmSymbolHandles::invoke_name();
   253   symbolHandle method_name = vmSymbolHandles::invokeExact_name();
   243 
   254 
   244   symbolHandle method_signature(THREAD, pool->signature_ref_at(index));
   255   symbolHandle method_signature(THREAD, pool->signature_ref_at(index));
   245   KlassHandle  current_klass   (THREAD, pool->pool_holder());
   256   KlassHandle  current_klass   (THREAD, pool->pool_holder());
   246 
   257 
   247   resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
   258   resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
  1039 
  1050 
  1040   // This guy is reached from InterpreterRuntime::resolve_invokedynamic.
  1051   // This guy is reached from InterpreterRuntime::resolve_invokedynamic.
  1041 
  1052 
  1042   // At this point, we only need the signature, and can ignore the name.
  1053   // At this point, we only need the signature, and can ignore the name.
  1043   symbolHandle method_signature(THREAD, pool->signature_ref_at(raw_index));  // raw_index works directly
  1054   symbolHandle method_signature(THREAD, pool->signature_ref_at(raw_index));  // raw_index works directly
  1044   symbolHandle method_name = vmSymbolHandles::invoke_name();
  1055   symbolHandle method_name = vmSymbolHandles::invokeExact_name();
  1045   KlassHandle resolved_klass = SystemDictionaryHandles::MethodHandle_klass();
  1056   KlassHandle resolved_klass = SystemDictionaryHandles::MethodHandle_klass();
  1046 
  1057 
  1047   // JSR 292:  this must be an implicitly generated method MethodHandle.invoke(*...)
  1058   // JSR 292:  this must be an implicitly generated method MethodHandle.invokeExact(*...)
  1048   // The extra MH receiver will be inserted into the stack on every call.
  1059   // The extra MH receiver will be inserted into the stack on every call.
  1049   methodHandle resolved_method;
  1060   methodHandle resolved_method;
  1050   lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, CHECK);
  1061   lookup_implicit_method(resolved_method, resolved_klass, method_name, method_signature, CHECK);
  1051   if (resolved_method.is_null()) {
  1062   if (resolved_method.is_null()) {
  1052     THROW(vmSymbols::java_lang_InternalError());
  1063     THROW(vmSymbols::java_lang_InternalError());