88 import java.lang.invoke.MethodType; |
88 import java.lang.invoke.MethodType; |
89 import jdk.internal.dynalink.DynamicLinkerFactory; |
89 import jdk.internal.dynalink.DynamicLinkerFactory; |
90 import jdk.internal.dynalink.linker.MethodHandleTransformer; |
90 import jdk.internal.dynalink.linker.MethodHandleTransformer; |
91 |
91 |
92 /** |
92 /** |
93 * Default implementation for a {@link DynamicLinkerFactory#setInternalObjectsFilter(MethodHandleTransformer)}. |
93 * Default implementation for a |
94 * Given a method handle of {@code Object(Object)} type for filtering parameter and another one of the same type for |
94 * {@link DynamicLinkerFactory#setInternalObjectsFilter(MethodHandleTransformer)} |
95 * filtering return values, applies them to passed method handles where their parameter types and/or return value types |
95 * that delegates to a pair of filtering method handles. Given a method handle |
96 * are declared to be {@link Object}. |
96 * of {@code Object(Object)} type for filtering parameter and another one of the |
|
97 * same type for filtering return values, applies them to passed method handles, |
|
98 * on those parameter types and/or return value types that are declared to be |
|
99 * {@link Object}. Also handles {@link MethodHandle#isVarargsCollector() method |
|
100 * handles that support variable arity calls} with a last {@code Object[]} |
|
101 * parameter. |
97 */ |
102 */ |
98 public class DefaultInternalObjectFilter implements MethodHandleTransformer { |
103 public class DefaultInternalObjectFilter implements MethodHandleTransformer { |
99 private static final MethodHandle FILTER_VARARGS = new Lookup(MethodHandles.lookup()).findStatic( |
104 private static final MethodHandle FILTER_VARARGS = new Lookup(MethodHandles.lookup()).findStatic( |
100 DefaultInternalObjectFilter.class, "filterVarArgs", MethodType.methodType(Object[].class, MethodHandle.class, Object[].class)); |
105 DefaultInternalObjectFilter.class, "filterVarArgs", MethodType.methodType(Object[].class, MethodHandle.class, Object[].class)); |
101 |
106 |
103 private final MethodHandle returnFilter; |
108 private final MethodHandle returnFilter; |
104 private final MethodHandle varArgFilter; |
109 private final MethodHandle varArgFilter; |
105 |
110 |
106 /** |
111 /** |
107 * Creates a new filter. |
112 * Creates a new filter. |
108 * @param parameterFilter the filter for method parameters. Must be of type {@code Object(Object)}, or null. |
113 * @param parameterFilter the filter for method parameters. Must be of type |
109 * @param returnFilter the filter for return values. Must be of type {@code Object(Object)}, or null. |
114 * {@code Object(Object)}, or {@code null}. |
110 * @throws IllegalArgumentException if one or both filters are not of the expected type. |
115 * @param returnFilter the filter for return values. Must be of type |
|
116 * {@code Object(Object)}, or {@code null}. |
|
117 * @throws IllegalArgumentException if one or both filters are not of the |
|
118 * expected type. |
111 */ |
119 */ |
112 public DefaultInternalObjectFilter(final MethodHandle parameterFilter, final MethodHandle returnFilter) { |
120 public DefaultInternalObjectFilter(final MethodHandle parameterFilter, final MethodHandle returnFilter) { |
113 this.parameterFilter = checkHandle(parameterFilter, "parameterFilter"); |
121 this.parameterFilter = checkHandle(parameterFilter, "parameterFilter"); |
114 this.returnFilter = checkHandle(returnFilter, "returnFilter"); |
122 this.returnFilter = checkHandle(returnFilter, "returnFilter"); |
115 this.varArgFilter = parameterFilter == null ? null : FILTER_VARARGS.bindTo(parameterFilter); |
123 this.varArgFilter = parameterFilter == null ? null : FILTER_VARARGS.bindTo(parameterFilter); |