--- old/src/java.base/share/classes/java/lang/invoke/MethodHandles.java 2018-01-17 12:27:16.000000000 -0800 +++ new/src/java.base/share/classes/java/lang/invoke/MethodHandles.java 2018-01-17 12:27:16.000000000 -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. *

* 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; }