changeset 4848:90e4cb6f78bb

8006179: JSR292 MethodHandles lookup with interface using findVirtual() Reviewed-by: twisti
author jrose
date Fri, 18 Jan 2013 20:47:51 -0800
parents 0ad964f2ced1
children 1040c44a496d
files src/share/classes/java/lang/invoke/DirectMethodHandle.java
diffstat 1 files changed, 9 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/java/lang/invoke/DirectMethodHandle.java	Fri Mar 08 15:53:50 2013 +0000
+++ b/src/share/classes/java/lang/invoke/DirectMethodHandle.java	Fri Jan 18 20:47:51 2013 -0800
@@ -44,6 +44,15 @@
         if (!m.isResolved())
             throw new InternalError();
 
+        if (m.getDeclaringClass().isInterface() && !m.isAbstract()) {
+            // Check for corner case: invokeinterface of Object method.
+            MemberName m2 = new MemberName(Object.class, m.getName(), m.getMethodType(), m.getModifiers());
+            m2 = MemberName.getFactory().resolveOrNull(m2, false, null);
+            if (m2 != null && m2.isPublic()) {
+                m = m2;
+            }
+        }
+
         MethodHandleNatives.init(this, (Object) m, doDispatch, lookupClass);
     }