--- a/src/java.base/share/classes/java/lang/invoke/MethodHandles.java Tue Jan 16 08:48:34 2018 +0100
+++ b/src/java.base/share/classes/java/lang/invoke/MethodHandles.java Wed Jan 17 15:17:50 2018 -0800
@@ -3766,6 +3766,7 @@
* specified in the elements of the {@code filters} array.
* The first element of the filter array corresponds to the {@code pos}
* argument of the target, and so on in sequence.
+ * The filter functions are invoked in left to right order.
* <p>
* Null arguments in the array are treated as identity functions,
* and the corresponding arguments left unchanged.
@@ -3836,11 +3837,12 @@
MethodHandle filterArguments(MethodHandle target, int pos, MethodHandle... filters) {
filterArgumentsCheckArity(target, pos, filters);
MethodHandle adapter = target;
- int curPos = pos-1; // pre-incremented
- for (MethodHandle filter : filters) {
- curPos += 1;
+ // process filters in reverse order so that the invocation of
+ // the resulting adapter will invoke the filters in left-to-right order
+ for (int i = filters.length - 1; i >= 0; --i) {
+ MethodHandle filter = filters[i];
if (filter == null) continue; // ignore null elements of filters
- adapter = filterArgument(adapter, curPos, filter);
+ adapter = filterArgument(adapter, pos + i, filter);
}
return adapter;
}