8163878: Remove unnecessary bridge methods, allocations in java.lang.invoke

Reviewed-by: mhaupt, shade
This commit is contained in:
Claes Redestad 2016-08-12 11:30:23 +02:00
parent bb160cec9c
commit fff5c5bf8d
11 changed files with 261 additions and 229 deletions

View file

@ -77,7 +77,7 @@ public class MethodHandles {
private MethodHandles() { } // do not instantiate
private static final MemberName.Factory IMPL_NAMES = MemberName.getFactory();
static final MemberName.Factory IMPL_NAMES = MemberName.getFactory();
// See IMPL_LOOKUP below.
@ -3268,12 +3268,11 @@ assertEquals("yz", (String) d0.invokeExact(123, "x", "y", "z"));
*/
public static
MethodHandle dropArguments(MethodHandle target, int pos, List<Class<?>> valueTypes) {
return dropArguments0(target, pos, copyTypes(valueTypes));
return dropArguments0(target, pos, copyTypes(valueTypes.toArray()));
}
private static List<Class<?>> copyTypes(List<Class<?>> types) {
Object[] a = types.toArray();
return Arrays.asList(Arrays.copyOf(a, a.length, Class[].class));
private static List<Class<?>> copyTypes(Object[] array) {
return Arrays.asList(Arrays.copyOf(array, array.length, Class[].class));
}
private static
@ -3352,13 +3351,13 @@ assertEquals("xz", (String) d12.invokeExact("x", 12, true, "z"));
*/
public static
MethodHandle dropArguments(MethodHandle target, int pos, Class<?>... valueTypes) {
return dropArguments(target, pos, Arrays.asList(valueTypes));
return dropArguments0(target, pos, copyTypes(valueTypes));
}
// private version which allows caller some freedom with error handling
private static MethodHandle dropArgumentsToMatch(MethodHandle target, int skip, List<Class<?>> newTypes, int pos,
boolean nullOnFailure) {
newTypes = copyTypes(newTypes);
newTypes = copyTypes(newTypes.toArray());
List<Class<?>> oldTypes = target.type().parameterList();
int match = oldTypes.size();
if (skip != 0) {
@ -3900,10 +3899,14 @@ assertEquals("boojum", (String) catTrace.invokeExact("boo", "jum"));
int foldVals = rtype == void.class ? 0 : 1;
int afterInsertPos = foldPos + foldVals;
boolean ok = (targetType.parameterCount() >= afterInsertPos + foldArgs);
if (ok && !(combinerType.parameterList()
.equals(targetType.parameterList().subList(afterInsertPos,
afterInsertPos + foldArgs))))
ok = false;
if (ok) {
for (int i = 0; i < foldArgs; i++) {
if (combinerType.parameterType(i) != targetType.parameterType(i + afterInsertPos)) {
ok = false;
break;
}
}
}
if (ok && foldVals != 0 && combinerType.returnType() != targetType.parameterType(foldPos))
ok = false;
if (!ok)