jdk/src/share/classes/sun/dyn/Invokers.java
changeset 4537 7c3c7f8d5195
parent 2707 5a17df307cbc
child 5506 202f599c92aa
equal deleted inserted replaced
4536:0f6ec6364a69 4537:7c3c7f8d5195
    42     private /*lazy*/ MethodHandle exactInvoker;
    42     private /*lazy*/ MethodHandle exactInvoker;
    43 
    43 
    44     // generic (untyped) invoker for the outgoing call
    44     // generic (untyped) invoker for the outgoing call
    45     private /*lazy*/ MethodHandle genericInvoker;
    45     private /*lazy*/ MethodHandle genericInvoker;
    46 
    46 
       
    47     // generic (untyped) invoker for the outgoing call; accepts a single Object[]
       
    48     private final /*lazy*/ MethodHandle[] varargsInvokers;
       
    49 
    47     /** Compute and cache information common to all collecting adapters
    50     /** Compute and cache information common to all collecting adapters
    48      *  that implement members of the erasure-family of the given erased type.
    51      *  that implement members of the erasure-family of the given erased type.
    49      */
    52      */
    50     public Invokers(Access token, MethodType targetType) {
    53     public Invokers(Access token, MethodType targetType) {
    51         Access.check(token);
    54         Access.check(token);
    52         this.targetType = targetType;
    55         this.targetType = targetType;
       
    56         this.varargsInvokers = new MethodHandle[targetType.parameterCount()+1];
    53     }
    57     }
    54 
    58 
    55     public static MethodType invokerType(MethodType targetType) {
    59     public static MethodType invokerType(MethodType targetType) {
    56         return targetType.insertParameterType(0, MethodHandle.class);
    60         return targetType.insertParameterTypes(0, MethodHandle.class);
    57     }
    61     }
    58 
    62 
    59     public MethodHandle exactInvoker() {
    63     public MethodHandle exactInvoker() {
    60         MethodHandle invoker = exactInvoker;
    64         MethodHandle invoker = exactInvoker;
    61         if (invoker != null)  return invoker;
    65         if (invoker != null)  return invoker;
    74         invoker = MethodHandles.convertArguments(invoker1, invokerType(genericType));
    78         invoker = MethodHandles.convertArguments(invoker1, invokerType(genericType));
    75         genericInvoker = invoker;
    79         genericInvoker = invoker;
    76         return invoker;
    80         return invoker;
    77     }
    81     }
    78 
    82 
    79     public MethodHandle varargsInvoker() {
    83     public MethodHandle varargsInvoker(int objectArgCount) {
    80         throw new UnsupportedOperationException("NYI");
    84         MethodHandle vaInvoker = varargsInvokers[objectArgCount];
       
    85         if (vaInvoker != null)  return vaInvoker;
       
    86         MethodHandle gInvoker = genericInvoker();
       
    87         MethodType vaType = MethodType.genericMethodType(objectArgCount, true);
       
    88         vaInvoker = MethodHandles.spreadArguments(gInvoker, invokerType(vaType));
       
    89         varargsInvokers[objectArgCount] = vaInvoker;
       
    90         return vaInvoker;
    81     }
    91     }
    82 
    92 
    83     public String toString() {
    93     public String toString() {
    84         return "Invokers"+targetType;
    94         return "Invokers"+targetType;
    85     }
    95     }