xref: /aosp_15_r20/art/test/952-invoke-custom/src/TestVariableArityLinkerMethod.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker import annotations.BootstrapMethod;
18*795d594fSAndroid Build Coastguard Worker import annotations.CalledByIndy;
19*795d594fSAndroid Build Coastguard Worker import annotations.Constant;
20*795d594fSAndroid Build Coastguard Worker import java.lang.invoke.CallSite;
21*795d594fSAndroid Build Coastguard Worker import java.lang.invoke.ConstantCallSite;
22*795d594fSAndroid Build Coastguard Worker import java.lang.invoke.MethodHandle;
23*795d594fSAndroid Build Coastguard Worker import java.lang.invoke.MethodHandles;
24*795d594fSAndroid Build Coastguard Worker import java.lang.invoke.MethodType;
25*795d594fSAndroid Build Coastguard Worker import java.util.Arrays;
26*795d594fSAndroid Build Coastguard Worker 
27*795d594fSAndroid Build Coastguard Worker public class TestVariableArityLinkerMethod extends TestBase {
printBsmArgs(String method, Object... args)28*795d594fSAndroid Build Coastguard Worker     private static void printBsmArgs(String method, Object... args) {
29*795d594fSAndroid Build Coastguard Worker         System.out.print(method);
30*795d594fSAndroid Build Coastguard Worker         System.out.print("(");
31*795d594fSAndroid Build Coastguard Worker         for (int i = 0; i < args.length; ++i) {
32*795d594fSAndroid Build Coastguard Worker             if (i != 0) {
33*795d594fSAndroid Build Coastguard Worker                 System.out.print(", ");
34*795d594fSAndroid Build Coastguard Worker             }
35*795d594fSAndroid Build Coastguard Worker             if (args[i] != null && args[i].getClass().isArray()) {
36*795d594fSAndroid Build Coastguard Worker                 Object array = args[i];
37*795d594fSAndroid Build Coastguard Worker                 if (array.getClass() == int[].class) {
38*795d594fSAndroid Build Coastguard Worker                     System.out.print(Arrays.toString((int[]) array));
39*795d594fSAndroid Build Coastguard Worker                 } else if (array.getClass() == long[].class) {
40*795d594fSAndroid Build Coastguard Worker                     System.out.print(Arrays.toString((long[]) array));
41*795d594fSAndroid Build Coastguard Worker                 } else if (array.getClass() == float[].class) {
42*795d594fSAndroid Build Coastguard Worker                     System.out.print(Arrays.toString((float[]) array));
43*795d594fSAndroid Build Coastguard Worker                 } else if (array.getClass() == double[].class) {
44*795d594fSAndroid Build Coastguard Worker                     System.out.print(Arrays.toString((double[]) array));
45*795d594fSAndroid Build Coastguard Worker                 } else {
46*795d594fSAndroid Build Coastguard Worker                     System.out.print(Arrays.toString((Object[]) array));
47*795d594fSAndroid Build Coastguard Worker                 }
48*795d594fSAndroid Build Coastguard Worker             } else {
49*795d594fSAndroid Build Coastguard Worker                 System.out.print(args[i]);
50*795d594fSAndroid Build Coastguard Worker             }
51*795d594fSAndroid Build Coastguard Worker         }
52*795d594fSAndroid Build Coastguard Worker         System.out.println(");");
53*795d594fSAndroid Build Coastguard Worker     }
54*795d594fSAndroid Build Coastguard Worker 
bsmWithStringArray( MethodHandles.Lookup lookup, String methodName, MethodType methodType, String... arityArgs)55*795d594fSAndroid Build Coastguard Worker     private static CallSite bsmWithStringArray(
56*795d594fSAndroid Build Coastguard Worker             MethodHandles.Lookup lookup,
57*795d594fSAndroid Build Coastguard Worker             String methodName,
58*795d594fSAndroid Build Coastguard Worker             MethodType methodType,
59*795d594fSAndroid Build Coastguard Worker             String... arityArgs)
60*795d594fSAndroid Build Coastguard Worker             throws Throwable {
61*795d594fSAndroid Build Coastguard Worker         printBsmArgs("bsmWithStringArray", lookup, methodName, methodType, arityArgs);
62*795d594fSAndroid Build Coastguard Worker         MethodHandle mh = lookup.findStatic(lookup.lookupClass(), methodName, methodType);
63*795d594fSAndroid Build Coastguard Worker         return new ConstantCallSite(mh);
64*795d594fSAndroid Build Coastguard Worker     }
65*795d594fSAndroid Build Coastguard Worker 
66*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
67*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
68*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
69*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestVariableArityLinkerMethod.class,
70*795d594fSAndroid Build Coastguard Worker                     name = "bsmWithStringArray",
71*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
72*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
73*795d594fSAndroid Build Coastguard Worker                         String.class,
74*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
75*795d594fSAndroid Build Coastguard Worker                         String[].class
76*795d594fSAndroid Build Coastguard Worker                     }
77*795d594fSAndroid Build Coastguard Worker                 ),
78*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "methodA",
79*795d594fSAndroid Build Coastguard Worker         constantArgumentsForBootstrapMethod = {
80*795d594fSAndroid Build Coastguard Worker             @Constant(stringValue = "Aachen"),
81*795d594fSAndroid Build Coastguard Worker             @Constant(stringValue = "Aalborg"),
82*795d594fSAndroid Build Coastguard Worker             @Constant(stringValue = "Aalto")
83*795d594fSAndroid Build Coastguard Worker         }
84*795d594fSAndroid Build Coastguard Worker     )
methodA()85*795d594fSAndroid Build Coastguard Worker     private static void methodA() {
86*795d594fSAndroid Build Coastguard Worker         System.out.println("methodA");
87*795d594fSAndroid Build Coastguard Worker     }
88*795d594fSAndroid Build Coastguard Worker 
89*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
90*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
91*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
92*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestVariableArityLinkerMethod.class,
93*795d594fSAndroid Build Coastguard Worker                     name = "bsmWithStringArray",
94*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
95*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
96*795d594fSAndroid Build Coastguard Worker                         String.class,
97*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
98*795d594fSAndroid Build Coastguard Worker                         String[].class
99*795d594fSAndroid Build Coastguard Worker                     }
100*795d594fSAndroid Build Coastguard Worker                 ),
101*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "methodB",
102*795d594fSAndroid Build Coastguard Worker         constantArgumentsForBootstrapMethod = {@Constant(stringValue = "barium")}
103*795d594fSAndroid Build Coastguard Worker     )
methodB()104*795d594fSAndroid Build Coastguard Worker     private static void methodB() {
105*795d594fSAndroid Build Coastguard Worker         System.out.println("methodB");
106*795d594fSAndroid Build Coastguard Worker     }
107*795d594fSAndroid Build Coastguard Worker 
108*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
109*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
110*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
111*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestVariableArityLinkerMethod.class,
112*795d594fSAndroid Build Coastguard Worker                     name = "bsmWithStringArray",
113*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
114*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
115*795d594fSAndroid Build Coastguard Worker                         String.class,
116*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
117*795d594fSAndroid Build Coastguard Worker                         String[].class
118*795d594fSAndroid Build Coastguard Worker                     }
119*795d594fSAndroid Build Coastguard Worker                 ),
120*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "methodC"
121*795d594fSAndroid Build Coastguard Worker     )
methodC()122*795d594fSAndroid Build Coastguard Worker     private static void methodC() {
123*795d594fSAndroid Build Coastguard Worker         System.out.println("methodC");
124*795d594fSAndroid Build Coastguard Worker     }
125*795d594fSAndroid Build Coastguard Worker 
bsmWithIntAndStringArray( MethodHandles.Lookup lookup, String methodName, MethodType methodType, int extraInt, String... extraArityArgs)126*795d594fSAndroid Build Coastguard Worker     private static CallSite bsmWithIntAndStringArray(
127*795d594fSAndroid Build Coastguard Worker             MethodHandles.Lookup lookup,
128*795d594fSAndroid Build Coastguard Worker             String methodName,
129*795d594fSAndroid Build Coastguard Worker             MethodType methodType,
130*795d594fSAndroid Build Coastguard Worker             int extraInt,
131*795d594fSAndroid Build Coastguard Worker             String... extraArityArgs)
132*795d594fSAndroid Build Coastguard Worker             throws Throwable {
133*795d594fSAndroid Build Coastguard Worker         printBsmArgs(
134*795d594fSAndroid Build Coastguard Worker                 "bsmWithIntAndStringArray",
135*795d594fSAndroid Build Coastguard Worker                 lookup,
136*795d594fSAndroid Build Coastguard Worker                 methodName,
137*795d594fSAndroid Build Coastguard Worker                 methodType,
138*795d594fSAndroid Build Coastguard Worker                 extraInt,
139*795d594fSAndroid Build Coastguard Worker                 extraArityArgs);
140*795d594fSAndroid Build Coastguard Worker         MethodHandle mh = lookup.findStatic(lookup.lookupClass(), methodName, methodType);
141*795d594fSAndroid Build Coastguard Worker         return new ConstantCallSite(mh);
142*795d594fSAndroid Build Coastguard Worker     }
143*795d594fSAndroid Build Coastguard Worker 
144*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
145*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
146*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
147*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestVariableArityLinkerMethod.class,
148*795d594fSAndroid Build Coastguard Worker                     name = "bsmWithIntAndStringArray",
149*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
150*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
151*795d594fSAndroid Build Coastguard Worker                         String.class,
152*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
153*795d594fSAndroid Build Coastguard Worker                         int.class,
154*795d594fSAndroid Build Coastguard Worker                         String[].class
155*795d594fSAndroid Build Coastguard Worker                     }
156*795d594fSAndroid Build Coastguard Worker                 ),
157*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "methodD",
158*795d594fSAndroid Build Coastguard Worker         constantArgumentsForBootstrapMethod = {
159*795d594fSAndroid Build Coastguard Worker             @Constant(intValue = 101),
160*795d594fSAndroid Build Coastguard Worker             @Constant(stringValue = "zoo"),
161*795d594fSAndroid Build Coastguard Worker             @Constant(stringValue = "zoogene"),
162*795d594fSAndroid Build Coastguard Worker             @Constant(stringValue = "zoogenic")
163*795d594fSAndroid Build Coastguard Worker         }
164*795d594fSAndroid Build Coastguard Worker     )
methodD()165*795d594fSAndroid Build Coastguard Worker     private static void methodD() {
166*795d594fSAndroid Build Coastguard Worker         System.out.println("methodD");
167*795d594fSAndroid Build Coastguard Worker     }
168*795d594fSAndroid Build Coastguard Worker 
169*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
170*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
171*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
172*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestVariableArityLinkerMethod.class,
173*795d594fSAndroid Build Coastguard Worker                     name = "bsmWithIntAndStringArray",
174*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
175*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
176*795d594fSAndroid Build Coastguard Worker                         String.class,
177*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
178*795d594fSAndroid Build Coastguard Worker                         int.class,
179*795d594fSAndroid Build Coastguard Worker                         String[].class
180*795d594fSAndroid Build Coastguard Worker                     }
181*795d594fSAndroid Build Coastguard Worker                 ),
182*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "methodE",
183*795d594fSAndroid Build Coastguard Worker         constantArgumentsForBootstrapMethod = {
184*795d594fSAndroid Build Coastguard Worker             @Constant(intValue = 102),
185*795d594fSAndroid Build Coastguard Worker             @Constant(stringValue = "zonic")
186*795d594fSAndroid Build Coastguard Worker         }
187*795d594fSAndroid Build Coastguard Worker     )
methodE()188*795d594fSAndroid Build Coastguard Worker     private static void methodE() {
189*795d594fSAndroid Build Coastguard Worker         System.out.println("methodE");
190*795d594fSAndroid Build Coastguard Worker     }
191*795d594fSAndroid Build Coastguard Worker 
192*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
193*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
194*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
195*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestVariableArityLinkerMethod.class,
196*795d594fSAndroid Build Coastguard Worker                     name = "bsmWithIntAndStringArray",
197*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
198*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
199*795d594fSAndroid Build Coastguard Worker                         String.class,
200*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
201*795d594fSAndroid Build Coastguard Worker                         int.class,
202*795d594fSAndroid Build Coastguard Worker                         String[].class
203*795d594fSAndroid Build Coastguard Worker                     }
204*795d594fSAndroid Build Coastguard Worker                 ),
205*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "methodF",
206*795d594fSAndroid Build Coastguard Worker         constantArgumentsForBootstrapMethod = {@Constant(intValue = 103)}
207*795d594fSAndroid Build Coastguard Worker     )
methodF()208*795d594fSAndroid Build Coastguard Worker     private static void methodF() {
209*795d594fSAndroid Build Coastguard Worker         System.out.println("methodF");
210*795d594fSAndroid Build Coastguard Worker     }
211*795d594fSAndroid Build Coastguard Worker 
bsmWithLongAndIntArray( MethodHandles.Lookup lookup, String methodName, MethodType methodType, long extraArg, int... arityArgs)212*795d594fSAndroid Build Coastguard Worker     private static CallSite bsmWithLongAndIntArray(
213*795d594fSAndroid Build Coastguard Worker             MethodHandles.Lookup lookup,
214*795d594fSAndroid Build Coastguard Worker             String methodName,
215*795d594fSAndroid Build Coastguard Worker             MethodType methodType,
216*795d594fSAndroid Build Coastguard Worker             long extraArg,
217*795d594fSAndroid Build Coastguard Worker             int... arityArgs)
218*795d594fSAndroid Build Coastguard Worker             throws Throwable {
219*795d594fSAndroid Build Coastguard Worker         printBsmArgs("bsmWithLongAndIntArray", lookup, methodName, methodType, extraArg, arityArgs);
220*795d594fSAndroid Build Coastguard Worker         MethodHandle mh = lookup.findStatic(lookup.lookupClass(), methodName, methodType);
221*795d594fSAndroid Build Coastguard Worker         return new ConstantCallSite(mh);
222*795d594fSAndroid Build Coastguard Worker     }
223*795d594fSAndroid Build Coastguard Worker 
224*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
225*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
226*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
227*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestVariableArityLinkerMethod.class,
228*795d594fSAndroid Build Coastguard Worker                     name = "bsmWithLongAndIntArray",
229*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
230*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
231*795d594fSAndroid Build Coastguard Worker                         String.class,
232*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
233*795d594fSAndroid Build Coastguard Worker                         long.class,
234*795d594fSAndroid Build Coastguard Worker                         int[].class
235*795d594fSAndroid Build Coastguard Worker                     }
236*795d594fSAndroid Build Coastguard Worker                 ),
237*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "methodG",
238*795d594fSAndroid Build Coastguard Worker         constantArgumentsForBootstrapMethod = {
239*795d594fSAndroid Build Coastguard Worker             @Constant(longValue = 0x123456789abcdefl),
240*795d594fSAndroid Build Coastguard Worker             @Constant(intValue = +1),
241*795d594fSAndroid Build Coastguard Worker             @Constant(intValue = -1),
242*795d594fSAndroid Build Coastguard Worker             @Constant(intValue = +2),
243*795d594fSAndroid Build Coastguard Worker             @Constant(intValue = -2)
244*795d594fSAndroid Build Coastguard Worker         }
245*795d594fSAndroid Build Coastguard Worker     )
methodG()246*795d594fSAndroid Build Coastguard Worker     private static void methodG() {
247*795d594fSAndroid Build Coastguard Worker         System.out.println("methodG");
248*795d594fSAndroid Build Coastguard Worker     }
249*795d594fSAndroid Build Coastguard Worker 
bsmWithFloatAndLongArray( MethodHandles.Lookup lookup, String methodName, MethodType methodType, float extraArg, long... arityArgs)250*795d594fSAndroid Build Coastguard Worker     private static CallSite bsmWithFloatAndLongArray(
251*795d594fSAndroid Build Coastguard Worker             MethodHandles.Lookup lookup,
252*795d594fSAndroid Build Coastguard Worker             String methodName,
253*795d594fSAndroid Build Coastguard Worker             MethodType methodType,
254*795d594fSAndroid Build Coastguard Worker             float extraArg,
255*795d594fSAndroid Build Coastguard Worker             long... arityArgs)
256*795d594fSAndroid Build Coastguard Worker             throws Throwable {
257*795d594fSAndroid Build Coastguard Worker         printBsmArgs(
258*795d594fSAndroid Build Coastguard Worker                 "bsmWithFloatAndLongArray", lookup, methodName, methodType, extraArg, arityArgs);
259*795d594fSAndroid Build Coastguard Worker         MethodHandle mh = lookup.findStatic(lookup.lookupClass(), methodName, methodType);
260*795d594fSAndroid Build Coastguard Worker         return new ConstantCallSite(mh);
261*795d594fSAndroid Build Coastguard Worker     }
262*795d594fSAndroid Build Coastguard Worker 
263*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
264*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
265*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
266*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestVariableArityLinkerMethod.class,
267*795d594fSAndroid Build Coastguard Worker                     name = "bsmWithFloatAndLongArray",
268*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
269*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
270*795d594fSAndroid Build Coastguard Worker                         String.class,
271*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
272*795d594fSAndroid Build Coastguard Worker                         float.class,
273*795d594fSAndroid Build Coastguard Worker                         long[].class
274*795d594fSAndroid Build Coastguard Worker                     }
275*795d594fSAndroid Build Coastguard Worker                 ),
276*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "methodH",
277*795d594fSAndroid Build Coastguard Worker         constantArgumentsForBootstrapMethod = {
278*795d594fSAndroid Build Coastguard Worker             @Constant(floatValue = (float) -Math.E),
279*795d594fSAndroid Build Coastguard Worker             @Constant(longValue = 999999999999l),
280*795d594fSAndroid Build Coastguard Worker             @Constant(longValue = -8888888888888l)
281*795d594fSAndroid Build Coastguard Worker         }
282*795d594fSAndroid Build Coastguard Worker     )
methodH()283*795d594fSAndroid Build Coastguard Worker     private static void methodH() {
284*795d594fSAndroid Build Coastguard Worker         System.out.println("methodH");
285*795d594fSAndroid Build Coastguard Worker     }
286*795d594fSAndroid Build Coastguard Worker 
bsmWithClassAndFloatArray( MethodHandles.Lookup lookup, String methodName, MethodType methodType, Class<?> extraArg, float... arityArgs)287*795d594fSAndroid Build Coastguard Worker     private static CallSite bsmWithClassAndFloatArray(
288*795d594fSAndroid Build Coastguard Worker             MethodHandles.Lookup lookup,
289*795d594fSAndroid Build Coastguard Worker             String methodName,
290*795d594fSAndroid Build Coastguard Worker             MethodType methodType,
291*795d594fSAndroid Build Coastguard Worker             Class<?> extraArg,
292*795d594fSAndroid Build Coastguard Worker             float... arityArgs)
293*795d594fSAndroid Build Coastguard Worker             throws Throwable {
294*795d594fSAndroid Build Coastguard Worker         printBsmArgs(
295*795d594fSAndroid Build Coastguard Worker                 "bsmWithClassAndFloatArray", lookup, methodName, methodType, extraArg, arityArgs);
296*795d594fSAndroid Build Coastguard Worker         MethodHandle mh = lookup.findStatic(lookup.lookupClass(), methodName, methodType);
297*795d594fSAndroid Build Coastguard Worker         return new ConstantCallSite(mh);
298*795d594fSAndroid Build Coastguard Worker     }
299*795d594fSAndroid Build Coastguard Worker 
300*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
301*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
302*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
303*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestVariableArityLinkerMethod.class,
304*795d594fSAndroid Build Coastguard Worker                     name = "bsmWithClassAndFloatArray",
305*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
306*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
307*795d594fSAndroid Build Coastguard Worker                         String.class,
308*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
309*795d594fSAndroid Build Coastguard Worker                         Class.class,
310*795d594fSAndroid Build Coastguard Worker                         float[].class
311*795d594fSAndroid Build Coastguard Worker                     }
312*795d594fSAndroid Build Coastguard Worker                 ),
313*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "methodI",
314*795d594fSAndroid Build Coastguard Worker         constantArgumentsForBootstrapMethod = {
315*795d594fSAndroid Build Coastguard Worker             @Constant(classValue = Throwable.class),
316*795d594fSAndroid Build Coastguard Worker             @Constant(floatValue = Float.MAX_VALUE),
317*795d594fSAndroid Build Coastguard Worker             @Constant(floatValue = Float.MIN_VALUE),
318*795d594fSAndroid Build Coastguard Worker             @Constant(floatValue = (float) Math.PI),
319*795d594fSAndroid Build Coastguard Worker             @Constant(floatValue = (float) -Math.PI)
320*795d594fSAndroid Build Coastguard Worker         }
321*795d594fSAndroid Build Coastguard Worker     )
methodI()322*795d594fSAndroid Build Coastguard Worker     private static void methodI() {
323*795d594fSAndroid Build Coastguard Worker         System.out.println("methodI");
324*795d594fSAndroid Build Coastguard Worker     }
325*795d594fSAndroid Build Coastguard Worker 
bsmWithDoubleArray( MethodHandles.Lookup lookup, String methodName, MethodType methodType, double... arityArgs)326*795d594fSAndroid Build Coastguard Worker     private static CallSite bsmWithDoubleArray(
327*795d594fSAndroid Build Coastguard Worker             MethodHandles.Lookup lookup,
328*795d594fSAndroid Build Coastguard Worker             String methodName,
329*795d594fSAndroid Build Coastguard Worker             MethodType methodType,
330*795d594fSAndroid Build Coastguard Worker             double... arityArgs)
331*795d594fSAndroid Build Coastguard Worker             throws Throwable {
332*795d594fSAndroid Build Coastguard Worker         printBsmArgs("bsmWithDoubleArray", lookup, methodName, methodType, arityArgs);
333*795d594fSAndroid Build Coastguard Worker         MethodHandle mh = lookup.findStatic(lookup.lookupClass(), methodName, methodType);
334*795d594fSAndroid Build Coastguard Worker         return new ConstantCallSite(mh);
335*795d594fSAndroid Build Coastguard Worker     }
336*795d594fSAndroid Build Coastguard Worker 
337*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
338*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
339*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
340*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestVariableArityLinkerMethod.class,
341*795d594fSAndroid Build Coastguard Worker                     name = "bsmWithDoubleArray",
342*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
343*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
344*795d594fSAndroid Build Coastguard Worker                         String.class,
345*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
346*795d594fSAndroid Build Coastguard Worker                         double[].class
347*795d594fSAndroid Build Coastguard Worker                     }
348*795d594fSAndroid Build Coastguard Worker                 ),
349*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "methodJ",
350*795d594fSAndroid Build Coastguard Worker         constantArgumentsForBootstrapMethod = {
351*795d594fSAndroid Build Coastguard Worker             @Constant(doubleValue = Double.MAX_VALUE),
352*795d594fSAndroid Build Coastguard Worker             @Constant(doubleValue = Double.MIN_VALUE),
353*795d594fSAndroid Build Coastguard Worker             @Constant(doubleValue = Math.E),
354*795d594fSAndroid Build Coastguard Worker             @Constant(doubleValue = -Math.PI)
355*795d594fSAndroid Build Coastguard Worker         }
356*795d594fSAndroid Build Coastguard Worker     )
methodJ()357*795d594fSAndroid Build Coastguard Worker     private static void methodJ() {
358*795d594fSAndroid Build Coastguard Worker         System.out.println("methodJ");
359*795d594fSAndroid Build Coastguard Worker     }
360*795d594fSAndroid Build Coastguard Worker 
bsmWithClassArray( MethodHandles.Lookup lookup, String methodName, MethodType methodType, Class... arityArgs)361*795d594fSAndroid Build Coastguard Worker     private static CallSite bsmWithClassArray(
362*795d594fSAndroid Build Coastguard Worker             MethodHandles.Lookup lookup,
363*795d594fSAndroid Build Coastguard Worker             String methodName,
364*795d594fSAndroid Build Coastguard Worker             MethodType methodType,
365*795d594fSAndroid Build Coastguard Worker             Class... arityArgs)
366*795d594fSAndroid Build Coastguard Worker             throws Throwable {
367*795d594fSAndroid Build Coastguard Worker         printBsmArgs("bsmWithClassArray", lookup, methodName, methodType, arityArgs);
368*795d594fSAndroid Build Coastguard Worker         MethodHandle mh = lookup.findStatic(lookup.lookupClass(), methodName, methodType);
369*795d594fSAndroid Build Coastguard Worker         return new ConstantCallSite(mh);
370*795d594fSAndroid Build Coastguard Worker     }
371*795d594fSAndroid Build Coastguard Worker 
372*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
373*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
374*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
375*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestVariableArityLinkerMethod.class,
376*795d594fSAndroid Build Coastguard Worker                     name = "bsmWithClassArray",
377*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
378*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
379*795d594fSAndroid Build Coastguard Worker                         String.class,
380*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
381*795d594fSAndroid Build Coastguard Worker                         Class[].class
382*795d594fSAndroid Build Coastguard Worker                     }
383*795d594fSAndroid Build Coastguard Worker                 ),
384*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "methodK",
385*795d594fSAndroid Build Coastguard Worker         constantArgumentsForBootstrapMethod = {
386*795d594fSAndroid Build Coastguard Worker             @Constant(classValue = Integer.class),
387*795d594fSAndroid Build Coastguard Worker             @Constant(classValue = MethodHandles.class),
388*795d594fSAndroid Build Coastguard Worker             @Constant(classValue = Arrays.class)
389*795d594fSAndroid Build Coastguard Worker         }
390*795d594fSAndroid Build Coastguard Worker     )
methodK()391*795d594fSAndroid Build Coastguard Worker     private static void methodK() {
392*795d594fSAndroid Build Coastguard Worker         System.out.println("methodK");
393*795d594fSAndroid Build Coastguard Worker     }
394*795d594fSAndroid Build Coastguard Worker 
395*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
396*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
397*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
398*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestVariableArityLinkerMethod.class,
399*795d594fSAndroid Build Coastguard Worker                     name = "bsmWithIntAndStringArray",
400*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
401*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
402*795d594fSAndroid Build Coastguard Worker                         String.class,
403*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
404*795d594fSAndroid Build Coastguard Worker                         int.class,
405*795d594fSAndroid Build Coastguard Worker                         String[].class
406*795d594fSAndroid Build Coastguard Worker                     }
407*795d594fSAndroid Build Coastguard Worker                 ),
408*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "methodO",
409*795d594fSAndroid Build Coastguard Worker         constantArgumentsForBootstrapMethod = {@Constant(intValue = 103), @Constant(intValue = 104)}
410*795d594fSAndroid Build Coastguard Worker     )
methodO()411*795d594fSAndroid Build Coastguard Worker     private static void methodO() {
412*795d594fSAndroid Build Coastguard Worker         // Arguments are not compatible
413*795d594fSAndroid Build Coastguard Worker         assertNotReached();
414*795d594fSAndroid Build Coastguard Worker     }
415*795d594fSAndroid Build Coastguard Worker 
416*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
417*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
418*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
419*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestVariableArityLinkerMethod.class,
420*795d594fSAndroid Build Coastguard Worker                     name = "bsmWithIntAndStringArray",
421*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
422*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
423*795d594fSAndroid Build Coastguard Worker                         String.class,
424*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
425*795d594fSAndroid Build Coastguard Worker                         int.class,
426*795d594fSAndroid Build Coastguard Worker                         String[].class
427*795d594fSAndroid Build Coastguard Worker                     }
428*795d594fSAndroid Build Coastguard Worker                 ),
429*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "methodP",
430*795d594fSAndroid Build Coastguard Worker         constantArgumentsForBootstrapMethod = {
431*795d594fSAndroid Build Coastguard Worker             @Constant(intValue = 103),
432*795d594fSAndroid Build Coastguard Worker             @Constant(stringValue = "A"),
433*795d594fSAndroid Build Coastguard Worker             @Constant(stringValue = "B"),
434*795d594fSAndroid Build Coastguard Worker             @Constant(intValue = 42)
435*795d594fSAndroid Build Coastguard Worker         }
436*795d594fSAndroid Build Coastguard Worker     )
methodP()437*795d594fSAndroid Build Coastguard Worker     private static void methodP() {
438*795d594fSAndroid Build Coastguard Worker         // Arguments are not compatible - specifically, the third
439*795d594fSAndroid Build Coastguard Worker         // component of potential collector array is an integer
440*795d594fSAndroid Build Coastguard Worker         // argument (42).
441*795d594fSAndroid Build Coastguard Worker         assertNotReached();
442*795d594fSAndroid Build Coastguard Worker     }
443*795d594fSAndroid Build Coastguard Worker 
bsmWithWiderArray( MethodHandles.Lookup lookup, String methodName, MethodType methodType, long[] extraArgs)444*795d594fSAndroid Build Coastguard Worker     private static CallSite bsmWithWiderArray(
445*795d594fSAndroid Build Coastguard Worker             MethodHandles.Lookup lookup, String methodName, MethodType methodType, long[] extraArgs)
446*795d594fSAndroid Build Coastguard Worker             throws Throwable {
447*795d594fSAndroid Build Coastguard Worker         printBsmArgs("bsmWithWiderArray", lookup, methodName, methodType, extraArgs);
448*795d594fSAndroid Build Coastguard Worker         MethodHandle mh = lookup.findStatic(lookup.lookupClass(), methodName, methodType);
449*795d594fSAndroid Build Coastguard Worker         return new ConstantCallSite(mh);
450*795d594fSAndroid Build Coastguard Worker     }
451*795d594fSAndroid Build Coastguard Worker 
452*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
453*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
454*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
455*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestVariableArityLinkerMethod.class,
456*795d594fSAndroid Build Coastguard Worker                     name = "bsmWithWiderArray",
457*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
458*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
459*795d594fSAndroid Build Coastguard Worker                         String.class,
460*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
461*795d594fSAndroid Build Coastguard Worker                         long[].class
462*795d594fSAndroid Build Coastguard Worker                     }
463*795d594fSAndroid Build Coastguard Worker                 ),
464*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "methodQ",
465*795d594fSAndroid Build Coastguard Worker         constantArgumentsForBootstrapMethod = {@Constant(intValue = 103), @Constant(intValue = 42)}
466*795d594fSAndroid Build Coastguard Worker     )
methodQ()467*795d594fSAndroid Build Coastguard Worker     private static void methodQ() {
468*795d594fSAndroid Build Coastguard Worker         assertNotReached();
469*795d594fSAndroid Build Coastguard Worker     }
470*795d594fSAndroid Build Coastguard Worker 
bsmWithBoxedArray( MethodHandles.Lookup lookup, String methodName, MethodType methodType, Integer[] extraArgs)471*795d594fSAndroid Build Coastguard Worker     private static CallSite bsmWithBoxedArray(
472*795d594fSAndroid Build Coastguard Worker             MethodHandles.Lookup lookup,
473*795d594fSAndroid Build Coastguard Worker             String methodName,
474*795d594fSAndroid Build Coastguard Worker             MethodType methodType,
475*795d594fSAndroid Build Coastguard Worker             Integer[] extraArgs)
476*795d594fSAndroid Build Coastguard Worker             throws Throwable {
477*795d594fSAndroid Build Coastguard Worker         printBsmArgs("bsmWithBoxedArray", lookup, methodName, methodType, extraArgs);
478*795d594fSAndroid Build Coastguard Worker         MethodHandle mh = lookup.findStatic(lookup.lookupClass(), methodName, methodType);
479*795d594fSAndroid Build Coastguard Worker         return new ConstantCallSite(mh);
480*795d594fSAndroid Build Coastguard Worker     }
481*795d594fSAndroid Build Coastguard Worker 
482*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
483*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
484*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
485*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestVariableArityLinkerMethod.class,
486*795d594fSAndroid Build Coastguard Worker                     name = "bsmWithBoxedArray",
487*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
488*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
489*795d594fSAndroid Build Coastguard Worker                         String.class,
490*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
491*795d594fSAndroid Build Coastguard Worker                         Integer[].class
492*795d594fSAndroid Build Coastguard Worker                     }
493*795d594fSAndroid Build Coastguard Worker                 ),
494*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "methodR",
495*795d594fSAndroid Build Coastguard Worker         constantArgumentsForBootstrapMethod = {
496*795d594fSAndroid Build Coastguard Worker             @Constant(intValue = 1030),
497*795d594fSAndroid Build Coastguard Worker             @Constant(intValue = 420)
498*795d594fSAndroid Build Coastguard Worker         }
499*795d594fSAndroid Build Coastguard Worker     )
methodR()500*795d594fSAndroid Build Coastguard Worker     private static void methodR() {
501*795d594fSAndroid Build Coastguard Worker         assertNotReached();
502*795d594fSAndroid Build Coastguard Worker     }
503*795d594fSAndroid Build Coastguard Worker 
test()504*795d594fSAndroid Build Coastguard Worker     static void test() {
505*795d594fSAndroid Build Coastguard Worker         // Happy cases
506*795d594fSAndroid Build Coastguard Worker         for (int i = 0; i < 2; ++i) {
507*795d594fSAndroid Build Coastguard Worker             methodA();
508*795d594fSAndroid Build Coastguard Worker             methodB();
509*795d594fSAndroid Build Coastguard Worker             methodC();
510*795d594fSAndroid Build Coastguard Worker         }
511*795d594fSAndroid Build Coastguard Worker         for (int i = 0; i < 2; ++i) {
512*795d594fSAndroid Build Coastguard Worker             methodD();
513*795d594fSAndroid Build Coastguard Worker             methodE();
514*795d594fSAndroid Build Coastguard Worker             methodF();
515*795d594fSAndroid Build Coastguard Worker         }
516*795d594fSAndroid Build Coastguard Worker         methodG();
517*795d594fSAndroid Build Coastguard Worker         methodH();
518*795d594fSAndroid Build Coastguard Worker         methodI();
519*795d594fSAndroid Build Coastguard Worker         methodJ();
520*795d594fSAndroid Build Coastguard Worker         methodK();
521*795d594fSAndroid Build Coastguard Worker 
522*795d594fSAndroid Build Coastguard Worker         // Broken cases
523*795d594fSAndroid Build Coastguard Worker         try {
524*795d594fSAndroid Build Coastguard Worker             // bsm has incompatible static methods. Collector
525*795d594fSAndroid Build Coastguard Worker             // component type is String, the corresponding static
526*795d594fSAndroid Build Coastguard Worker             // arguments are int values.
527*795d594fSAndroid Build Coastguard Worker             methodO();
528*795d594fSAndroid Build Coastguard Worker             assertNotReached();
529*795d594fSAndroid Build Coastguard Worker         } catch (BootstrapMethodError expected) {
530*795d594fSAndroid Build Coastguard Worker             System.out.print("methodO => ");
531*795d594fSAndroid Build Coastguard Worker             System.out.print(expected.getClass());
532*795d594fSAndroid Build Coastguard Worker             System.out.print(" => ");
533*795d594fSAndroid Build Coastguard Worker             System.out.println(expected.getCause().getClass());
534*795d594fSAndroid Build Coastguard Worker         }
535*795d594fSAndroid Build Coastguard Worker         try {
536*795d594fSAndroid Build Coastguard Worker             // bsm has a trailing String array for the collector array.
537*795d594fSAndroid Build Coastguard Worker             // There is an int value amongst the String values.
538*795d594fSAndroid Build Coastguard Worker             methodP();
539*795d594fSAndroid Build Coastguard Worker             assertNotReached();
540*795d594fSAndroid Build Coastguard Worker         } catch (BootstrapMethodError expected) {
541*795d594fSAndroid Build Coastguard Worker             System.out.print("methodP => ");
542*795d594fSAndroid Build Coastguard Worker             System.out.print(expected.getClass());
543*795d594fSAndroid Build Coastguard Worker             System.out.print(" => ");
544*795d594fSAndroid Build Coastguard Worker             System.out.println(expected.getCause().getClass());
545*795d594fSAndroid Build Coastguard Worker         }
546*795d594fSAndroid Build Coastguard Worker         try {
547*795d594fSAndroid Build Coastguard Worker             // bsm has as trailing long[] element for the collector array.
548*795d594fSAndroid Build Coastguard Worker             // The corresponding static bsm arguments are of type int.
549*795d594fSAndroid Build Coastguard Worker             methodQ();
550*795d594fSAndroid Build Coastguard Worker             assertNotReached();
551*795d594fSAndroid Build Coastguard Worker         } catch (BootstrapMethodError expected) {
552*795d594fSAndroid Build Coastguard Worker             System.out.print("methodQ => ");
553*795d594fSAndroid Build Coastguard Worker             System.out.print(expected.getClass());
554*795d594fSAndroid Build Coastguard Worker             System.out.print(" => ");
555*795d594fSAndroid Build Coastguard Worker             System.out.println(expected.getCause().getClass());
556*795d594fSAndroid Build Coastguard Worker         }
557*795d594fSAndroid Build Coastguard Worker         try {
558*795d594fSAndroid Build Coastguard Worker             // bsm has as trailing Integer[] element for the collector array.
559*795d594fSAndroid Build Coastguard Worker             // The corresponding static bsm arguments are of type int.
560*795d594fSAndroid Build Coastguard Worker             methodR();
561*795d594fSAndroid Build Coastguard Worker             assertNotReached();
562*795d594fSAndroid Build Coastguard Worker         } catch (BootstrapMethodError expected) {
563*795d594fSAndroid Build Coastguard Worker             System.out.print("methodR => ");
564*795d594fSAndroid Build Coastguard Worker             System.out.print(expected.getClass());
565*795d594fSAndroid Build Coastguard Worker             System.out.print(" => ");
566*795d594fSAndroid Build Coastguard Worker             System.out.println(expected.getCause().getClass());
567*795d594fSAndroid Build Coastguard Worker         }
568*795d594fSAndroid Build Coastguard Worker     }
569*795d594fSAndroid Build Coastguard Worker }
570