8255449: Improve the exception message of MethodHandles::permuteArguments

Reviewed-by: chegar, mchung
This commit is contained in:
Jorn Vernee 2020-10-29 18:32:48 +00:00
parent 2a50c3f810
commit 2a2fa134c3
2 changed files with 75 additions and 16 deletions

View file

@ -4739,23 +4739,24 @@ assert((int)twice.invokeExact(21) == 42);
if (newType.returnType() != oldType.returnType())
throw newIllegalArgumentException("return types do not match",
oldType, newType);
if (reorder.length == oldType.parameterCount()) {
int limit = newType.parameterCount();
boolean bad = false;
for (int j = 0; j < reorder.length; j++) {
int i = reorder[j];
if (i < 0 || i >= limit) {
bad = true; break;
}
Class<?> src = newType.parameterType(i);
Class<?> dst = oldType.parameterType(j);
if (src != dst)
throw newIllegalArgumentException("parameter types do not match after reorder",
oldType, newType);
if (reorder.length != oldType.parameterCount())
throw newIllegalArgumentException("old type parameter count and reorder array length do not match",
oldType, Arrays.toString(reorder));
int limit = newType.parameterCount();
for (int j = 0; j < reorder.length; j++) {
int i = reorder[j];
if (i < 0 || i >= limit) {
throw newIllegalArgumentException("index is out of bounds for new type",
i, newType);
}
if (!bad) return true;
Class<?> src = newType.parameterType(i);
Class<?> dst = oldType.parameterType(j);
if (src != dst)
throw newIllegalArgumentException("parameter types do not match after reorder",
oldType, newType);
}
throw newIllegalArgumentException("bad reorder array: "+Arrays.toString(reorder));
return true;
}
/**