7087658: MethodHandles.Lookup.findVirtual is confused by interface methods that are multiply inherited
Reviewed-by: twisti
--- 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.