nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/support/DefaultInternalObjectFilter.java
changeset 33333 0bad500ce4e0
parent 28881 0008daeef352
equal deleted inserted replaced
33332:f180be6368d8 33333:0bad500ce4e0
    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);