From c04c841a700b9b9bd33e531b69aca2e00a18c20b Mon Sep 17 00:00:00 2001 From: John R Rose Date: Thu, 12 Jul 2012 00:12:28 -0700 Subject: [PATCH] 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 | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/jdk/src/share/classes/java/lang/invoke/MemberName.java b/jdk/src/share/classes/java/lang/invoke/MemberName.java index 5a431a53a8b..34789cbe0c8 100644 --- a/jdk/src/share/classes/java/lang/invoke/MemberName.java +++ b/jdk/src/share/classes/java/lang/invoke/MemberName.java @@ -622,8 +622,12 @@ import static java.lang.invoke.MethodHandleStatics.*; 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.