private static int compareOverloads(SingleMethodDesc m1, SingleMethodDesc m2, Object[] args, boolean varArgs) {
int res = 0;
int maxParamCount = Math.max(m1.getParameterCount(), m2.getParameterCount());
assert !varArgs || m1.isVarArgs() && m2.isVarArgs();
assert varArgs || (m1.getParameterCount() == m2.getParameterCount() && args.length == m1.getParameterCount());
assert maxParamCount <= args.length;
for (int i = 0; i < maxParamCount; i++) {
Class<?> t1 = getParameterType(m1.getParameterTypes(), i, varArgs);
Class<?> t2 = getParameterType(m2.getParameterTypes(), i, varArgs);
if (t1 == t2) {
continue;
}
int r = compareAssignable(t1, t2);
if (r == 0) {
continue;
}
if (res == 0) {
res = r;
} else if (res != r) {
res = 0;
break;
}
}
return res;
}