Skip to content

Commit

Permalink
Prioritize non-varargs methods in Java calls
Browse files Browse the repository at this point in the history
  • Loading branch information
TPGamesNL committed Dec 24, 2022
1 parent af11d02 commit 8f6bb82
Showing 1 changed file with 17 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -564,8 +564,8 @@ private static Object[] createInstanceArgumentsCopy(Object target, Object[] argu
*/
private Optional<MethodHandle> findCompatibleMethod(Descriptor descriptor, Object[] args) {
return getCallSite(descriptor).stream()
.filter(mh -> matchesArgs(args, mh))
.findFirst();
.filter(mh -> matchesArgs(args, mh))
.min(ExprJavaCall::prioritizeMethodHandles);
}

/**
Expand Down Expand Up @@ -609,6 +609,21 @@ private static boolean matchesArgs(Object[] args, MethodHandle mh) {
return true;
}

/**
* Method for prioritizing certain {@link MethodHandle}s over others.
* The lesser method handle has priority.
*/
private static int prioritizeMethodHandles(MethodHandle mh1, MethodHandle mh2) {
boolean isMh1Varargs = mh1.isVarargsCollector();
boolean isMh2Varargs = mh2.isVarargsCollector();

if (isMh1Varargs ^ isMh2Varargs) {
return isMh1Varargs ? 1 : -1;
}

return 0;
}

private static Object[] convertTypes(MethodHandle mh, Object[] args) {
Class<?>[] params = mh.type().parameterArray();
int varargsIndex = params.length - 1;
Expand Down

0 comments on commit 8f6bb82

Please sign in to comment.