8155985: Persistent Parameter Processing

Reviewed-by: jrose, vlivanov, ahgross
This commit is contained in:
Michael Haupt 2016-05-20 09:58:14 +01:00
parent a4ff82596a
commit 95535658a6

View File

@ -3266,6 +3266,16 @@ assertEquals("yz", (String) d0.invokeExact(123, "x", "y", "z"));
*/ */
public static public static
MethodHandle dropArguments(MethodHandle target, int pos, List<Class<?>> valueTypes) { MethodHandle dropArguments(MethodHandle target, int pos, List<Class<?>> valueTypes) {
return dropArguments0(target, pos, copyTypes(valueTypes));
}
private static List<Class<?>> copyTypes(List<Class<?>> types) {
Object[] a = types.toArray();
return Arrays.asList(Arrays.copyOf(a, a.length, Class[].class));
}
private static
MethodHandle dropArguments0(MethodHandle target, int pos, List<Class<?>> valueTypes) {
MethodType oldType = target.type(); // get NPE MethodType oldType = target.type(); // get NPE
int dropped = dropArgumentChecks(oldType, pos, valueTypes); int dropped = dropArgumentChecks(oldType, pos, valueTypes);
MethodType newType = oldType.insertParameterTypes(pos, valueTypes); MethodType newType = oldType.insertParameterTypes(pos, valueTypes);
@ -3346,6 +3356,7 @@ assertEquals("xz", (String) d12.invokeExact("x", 12, true, "z"));
// private version which allows caller some freedom with error handling // private version which allows caller some freedom with error handling
private static MethodHandle dropArgumentsToMatch(MethodHandle target, int skip, List<Class<?>> newTypes, int pos, private static MethodHandle dropArgumentsToMatch(MethodHandle target, int skip, List<Class<?>> newTypes, int pos,
boolean nullOnFailure) { boolean nullOnFailure) {
newTypes = copyTypes(newTypes);
List<Class<?>> oldTypes = target.type().parameterList(); List<Class<?>> oldTypes = target.type().parameterList();
int match = oldTypes.size(); int match = oldTypes.size();
if (skip != 0) { if (skip != 0) {
@ -3377,11 +3388,11 @@ assertEquals("xz", (String) d12.invokeExact("x", 12, true, "z"));
// target: ( S*[skip], M*[match] ) // target: ( S*[skip], M*[match] )
MethodHandle adapter = target; MethodHandle adapter = target;
if (add > 0) { if (add > 0) {
adapter = dropArguments(adapter, skip+ match, addTypes); adapter = dropArguments0(adapter, skip+ match, addTypes);
} }
// adapter: (S*[skip], M*[match], A*[add] ) // adapter: (S*[skip], M*[match], A*[add] )
if (pos > 0) { if (pos > 0) {
adapter = dropArguments(adapter, skip, newTypes.subList(0, pos)); adapter = dropArguments0(adapter, skip, newTypes.subList(0, pos));
} }
// adapter: (S*[skip], P*[pos], M*[match], A*[add] ) // adapter: (S*[skip], P*[pos], M*[match], A*[add] )
return adapter; return adapter;
@ -4288,7 +4299,7 @@ assertEquals("boojum", (String) catTrace.invokeExact("boo", "jum"));
step.set(i, dropArgumentsToMatch(identityOrVoid(t), 0, commonParameterSequence, i)); step.set(i, dropArgumentsToMatch(identityOrVoid(t), 0, commonParameterSequence, i));
} }
if (pred.get(i) == null) { if (pred.get(i) == null) {
pred.set(i, dropArguments(constant(boolean.class, true), 0, commonParameterSequence)); pred.set(i, dropArguments0(constant(boolean.class, true), 0, commonParameterSequence));
} }
if (fini.get(i) == null) { if (fini.get(i) == null) {
fini.set(i, empty(methodType(t, commonParameterSequence))); fini.set(i, empty(methodType(t, commonParameterSequence)));
@ -4313,7 +4324,7 @@ assertEquals("boojum", (String) catTrace.invokeExact("boo", "jum"));
return hs.stream().map(h -> { return hs.stream().map(h -> {
int pc = h.type().parameterCount(); int pc = h.type().parameterCount();
int tpsize = targetParams.size(); int tpsize = targetParams.size();
return pc < tpsize ? dropArguments(h, pc, targetParams.subList(pc, tpsize)) : h; return pc < tpsize ? dropArguments0(h, pc, targetParams.subList(pc, tpsize)) : h;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
} }