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