7087658: MethodHandles.Lookup.findVirtual is confused by interface methods that are multiply inherited
authorjrose
Thu, 12 Jul 2012 00:12:28 -0700
changeset 13421 d20670384420
parent 13420 62cedce8afa6
child 13422 72b63ee33f57
7087658: MethodHandles.Lookup.findVirtual is confused by interface methods that are multiply inherited Reviewed-by: twisti
jdk/src/share/classes/java/lang/invoke/MemberName.java
--- a/jdk/src/share/classes/java/lang/invoke/MemberName.java	Thu Jul 12 00:11:35 2012 -0700
+++ b/jdk/src/share/classes/java/lang/invoke/MemberName.java	Thu Jul 12 00:12:28 2012 -0700
@@ -622,8 +622,12 @@
             MemberName[] buf = { m };
             int n = MethodHandleNatives.getMembers(m.getDeclaringClass(),
                     m.getName(), matchSig, matchFlags, lookupClass, 0, buf);
-            if (n != 1)  return false;
-            return m.isResolved();
+            if (n == 0 || !m.isResolved())
+                return false;  // no result
+            else if (n == 1 || m.clazz.isInterface())
+                return true;   // unique result, or multiple inheritance is OK
+            else
+                return false;  // ambiguous result (can this happen?)
         }
         /** Produce a resolved version of the given member.
          *  Super types are searched (for inherited members) if {@code searchSupers} is true.