src/java.base/share/classes/java/lang/invoke/MethodHandles.java
changeset 48544 050352ed64d5
parent 47856 76519338df34
child 48826 c4d9d1b08e2e
--- 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;
     }