hotspot/src/share/vm/runtime/sharedRuntime.cpp
changeset 36331 eeeb86fd9922
parent 35606 d873b64009cc
child 37152 29e68f1d35bb
child 36508 5f9eee6b383b
--- a/hotspot/src/share/vm/runtime/sharedRuntime.cpp	Fri Feb 26 01:58:26 2016 +0300
+++ b/hotspot/src/share/vm/runtime/sharedRuntime.cpp	Fri Feb 26 01:58:29 2016 +0300
@@ -1134,12 +1134,19 @@
         MethodHandles::is_signature_polymorphic_intrinsic(id)) {
       bc = MethodHandles::signature_polymorphic_intrinsic_bytecode(id);
 
-      // Need to adjust invokehandle since inlining through signature-polymorphic
-      // method happened.
-      if (bc == Bytecodes::_invokehandle &&
-          !MethodHandles::is_signature_polymorphic_method(attached_method())) {
-        bc = attached_method->is_static() ? Bytecodes::_invokestatic
-                                          : Bytecodes::_invokevirtual;
+      // Adjust invocation mode according to the attached method.
+      switch (bc) {
+        case Bytecodes::_invokeinterface:
+          if (!attached_method->method_holder()->is_interface()) {
+            bc = Bytecodes::_invokevirtual;
+          }
+          break;
+        case Bytecodes::_invokehandle:
+          if (!MethodHandles::is_signature_polymorphic_method(attached_method())) {
+            bc = attached_method->is_static() ? Bytecodes::_invokestatic
+                                              : Bytecodes::_invokevirtual;
+          }
+          break;
       }
     }
   } else {