xref: /aosp_15_r20/art/test/952-invoke-custom/src/TestBadBootstrapArguments.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.lang.invoke.WrongMethodTypeException;
26*795d594fSAndroid Build Coastguard Worker 
27*795d594fSAndroid Build Coastguard Worker public class TestBadBootstrapArguments extends TestBase {
bsm( MethodHandles.Lookup lookup, String methodName, MethodType methodType, int extraInt, String extraString)28*795d594fSAndroid Build Coastguard Worker     private static CallSite bsm(
29*795d594fSAndroid Build Coastguard Worker             MethodHandles.Lookup lookup,
30*795d594fSAndroid Build Coastguard Worker             String methodName,
31*795d594fSAndroid Build Coastguard Worker             MethodType methodType,
32*795d594fSAndroid Build Coastguard Worker             int extraInt,
33*795d594fSAndroid Build Coastguard Worker             String extraString)
34*795d594fSAndroid Build Coastguard Worker             throws Throwable {
35*795d594fSAndroid Build Coastguard Worker         System.out.print("bsm(");
36*795d594fSAndroid Build Coastguard Worker         System.out.print(lookup.lookupClass());
37*795d594fSAndroid Build Coastguard Worker         System.out.print(", ");
38*795d594fSAndroid Build Coastguard Worker         System.out.print(methodName);
39*795d594fSAndroid Build Coastguard Worker         System.out.print(", ");
40*795d594fSAndroid Build Coastguard Worker         System.out.print(methodType);
41*795d594fSAndroid Build Coastguard Worker         System.out.print(", ");
42*795d594fSAndroid Build Coastguard Worker         System.out.print(extraInt);
43*795d594fSAndroid Build Coastguard Worker         System.out.print(", ");
44*795d594fSAndroid Build Coastguard Worker         System.out.print(extraString);
45*795d594fSAndroid Build Coastguard Worker         System.out.println(")");
46*795d594fSAndroid Build Coastguard Worker         MethodHandle mh = lookup.findStatic(lookup.lookupClass(), methodName, methodType);
47*795d594fSAndroid Build Coastguard Worker         return new ConstantCallSite(mh);
48*795d594fSAndroid Build Coastguard Worker     }
49*795d594fSAndroid Build Coastguard Worker 
50*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
51*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
52*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
53*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestBadBootstrapArguments.class,
54*795d594fSAndroid Build Coastguard Worker                     name = "bsm",
55*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
56*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
57*795d594fSAndroid Build Coastguard Worker                         String.class,
58*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
59*795d594fSAndroid Build Coastguard Worker                         int.class,
60*795d594fSAndroid Build Coastguard Worker                         String.class
61*795d594fSAndroid Build Coastguard Worker                     }
62*795d594fSAndroid Build Coastguard Worker                 ),
63*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "happy",
64*795d594fSAndroid Build Coastguard Worker         constantArgumentsForBootstrapMethod = {
65*795d594fSAndroid Build Coastguard Worker             @Constant(intValue = -1),
66*795d594fSAndroid Build Coastguard Worker             @Constant(stringValue = "very")
67*795d594fSAndroid Build Coastguard Worker         }
68*795d594fSAndroid Build Coastguard Worker     )
invokeHappy()69*795d594fSAndroid Build Coastguard Worker     private static void invokeHappy() {
70*795d594fSAndroid Build Coastguard Worker         assertNotReached();
71*795d594fSAndroid Build Coastguard Worker     }
72*795d594fSAndroid Build Coastguard Worker 
happy()73*795d594fSAndroid Build Coastguard Worker     private static void happy() {
74*795d594fSAndroid Build Coastguard Worker         System.out.println("happy");
75*795d594fSAndroid Build Coastguard Worker     }
76*795d594fSAndroid Build Coastguard Worker 
77*795d594fSAndroid Build Coastguard Worker     // BootstrapMethod.parameterTypes != parameterTypesOf(constantArgumentsForBootstrapMethod)
78*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
79*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
80*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
81*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestBadBootstrapArguments.class,
82*795d594fSAndroid Build Coastguard Worker                     name = "bsm",
83*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
84*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
85*795d594fSAndroid Build Coastguard Worker                         String.class,
86*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
87*795d594fSAndroid Build Coastguard Worker                         int.class,
88*795d594fSAndroid Build Coastguard Worker                         double.class
89*795d594fSAndroid Build Coastguard Worker                     }
90*795d594fSAndroid Build Coastguard Worker                 ),
91*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "wrongParameterTypes",
92*795d594fSAndroid Build Coastguard Worker         constantArgumentsForBootstrapMethod = {
93*795d594fSAndroid Build Coastguard Worker             @Constant(intValue = -1),
94*795d594fSAndroid Build Coastguard Worker             @Constant(stringValue = "very")
95*795d594fSAndroid Build Coastguard Worker         }
96*795d594fSAndroid Build Coastguard Worker     )
invokeWrongParameterTypes()97*795d594fSAndroid Build Coastguard Worker     private static void invokeWrongParameterTypes() throws NoSuchMethodError {
98*795d594fSAndroid Build Coastguard Worker         assertNotReached();
99*795d594fSAndroid Build Coastguard Worker     }
100*795d594fSAndroid Build Coastguard Worker 
wrongParameterTypes()101*795d594fSAndroid Build Coastguard Worker     private static void wrongParameterTypes() {
102*795d594fSAndroid Build Coastguard Worker         System.out.println("wrongParameterTypes");
103*795d594fSAndroid Build Coastguard Worker     }
104*795d594fSAndroid Build Coastguard Worker 
105*795d594fSAndroid Build Coastguard Worker     // BootstrapMethod.parameterTypes != parameterTypesOf(constantArgumentsForBootstrapMethod)
106*795d594fSAndroid Build Coastguard Worker     // (missing constantArgumentTypes))
107*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
108*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
109*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
110*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestBadBootstrapArguments.class,
111*795d594fSAndroid Build Coastguard Worker                     name = "bsm",
112*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
113*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
114*795d594fSAndroid Build Coastguard Worker                         String.class,
115*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
116*795d594fSAndroid Build Coastguard Worker                         int.class,
117*795d594fSAndroid Build Coastguard Worker                         double.class
118*795d594fSAndroid Build Coastguard Worker                     }
119*795d594fSAndroid Build Coastguard Worker                 ),
120*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "missingParameterTypes",
121*795d594fSAndroid Build Coastguard Worker         constantArgumentsForBootstrapMethod = {}
122*795d594fSAndroid Build Coastguard Worker     )
invokeMissingParameterTypes()123*795d594fSAndroid Build Coastguard Worker     private static void invokeMissingParameterTypes() throws NoSuchMethodError {
124*795d594fSAndroid Build Coastguard Worker         assertNotReached();
125*795d594fSAndroid Build Coastguard Worker     }
126*795d594fSAndroid Build Coastguard Worker 
missingParameterTypes()127*795d594fSAndroid Build Coastguard Worker     private static void missingParameterTypes() {
128*795d594fSAndroid Build Coastguard Worker         System.out.println("missingParameterTypes");
129*795d594fSAndroid Build Coastguard Worker     }
130*795d594fSAndroid Build Coastguard Worker 
131*795d594fSAndroid Build Coastguard Worker     // BootstrapMethod.parameterTypes != parameterTypesOf(constantArgumentsForBootstrapMethod):
132*795d594fSAndroid Build Coastguard Worker     // extra constant present
133*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
134*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
135*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
136*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestBadBootstrapArguments.class,
137*795d594fSAndroid Build Coastguard Worker                     name = "bsm",
138*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
139*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
140*795d594fSAndroid Build Coastguard Worker                         String.class,
141*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
142*795d594fSAndroid Build Coastguard Worker                         int.class,
143*795d594fSAndroid Build Coastguard Worker                         String.class
144*795d594fSAndroid Build Coastguard Worker                     }
145*795d594fSAndroid Build Coastguard Worker                 ),
146*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "extraArguments",
147*795d594fSAndroid Build Coastguard Worker         constantArgumentsForBootstrapMethod = {
148*795d594fSAndroid Build Coastguard Worker             @Constant(intValue = 1),
149*795d594fSAndroid Build Coastguard Worker             @Constant(stringValue = "2"),
150*795d594fSAndroid Build Coastguard Worker             @Constant(intValue = 3)
151*795d594fSAndroid Build Coastguard Worker         }
152*795d594fSAndroid Build Coastguard Worker     )
invokeExtraArguments()153*795d594fSAndroid Build Coastguard Worker     private static void invokeExtraArguments() {
154*795d594fSAndroid Build Coastguard Worker         assertNotReached();
155*795d594fSAndroid Build Coastguard Worker     }
156*795d594fSAndroid Build Coastguard Worker 
extraArguments()157*795d594fSAndroid Build Coastguard Worker     private static void extraArguments() {
158*795d594fSAndroid Build Coastguard Worker         System.out.println("extraArguments");
159*795d594fSAndroid Build Coastguard Worker     }
160*795d594fSAndroid Build Coastguard Worker 
161*795d594fSAndroid Build Coastguard Worker     // constantArgumentTypes do not correspond to expected parameter types
162*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
163*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
164*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
165*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestBadBootstrapArguments.class,
166*795d594fSAndroid Build Coastguard Worker                     name = "bsm",
167*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
168*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
169*795d594fSAndroid Build Coastguard Worker                         String.class,
170*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
171*795d594fSAndroid Build Coastguard Worker                         int.class,
172*795d594fSAndroid Build Coastguard Worker                         String.class
173*795d594fSAndroid Build Coastguard Worker                     }
174*795d594fSAndroid Build Coastguard Worker                 ),
175*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "wrongArguments",
176*795d594fSAndroid Build Coastguard Worker         constantArgumentsForBootstrapMethod = {
177*795d594fSAndroid Build Coastguard Worker             @Constant(stringValue = "1"),
178*795d594fSAndroid Build Coastguard Worker             @Constant(doubleValue = Math.PI)
179*795d594fSAndroid Build Coastguard Worker         }
180*795d594fSAndroid Build Coastguard Worker     )
invokeWrongArguments()181*795d594fSAndroid Build Coastguard Worker     private static void invokeWrongArguments() {
182*795d594fSAndroid Build Coastguard Worker         assertNotReached();
183*795d594fSAndroid Build Coastguard Worker     }
184*795d594fSAndroid Build Coastguard Worker 
wrongArguments()185*795d594fSAndroid Build Coastguard Worker     private static void wrongArguments() {
186*795d594fSAndroid Build Coastguard Worker         System.out.println("wrongArguments");
187*795d594fSAndroid Build Coastguard Worker     }
188*795d594fSAndroid Build Coastguard Worker 
189*795d594fSAndroid Build Coastguard Worker     // constantArgumentTypes do not correspond to expected parameter types
190*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
191*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
192*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
193*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestBadBootstrapArguments.class,
194*795d594fSAndroid Build Coastguard Worker                     name = "bsm",
195*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
196*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
197*795d594fSAndroid Build Coastguard Worker                         String.class,
198*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
199*795d594fSAndroid Build Coastguard Worker                         int.class,
200*795d594fSAndroid Build Coastguard Worker                         String.class
201*795d594fSAndroid Build Coastguard Worker                     }
202*795d594fSAndroid Build Coastguard Worker                 ),
203*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "wrongArgumentsAgain",
204*795d594fSAndroid Build Coastguard Worker         constantArgumentsForBootstrapMethod = {
205*795d594fSAndroid Build Coastguard Worker             @Constant(doubleValue = Math.PI),
206*795d594fSAndroid Build Coastguard Worker             @Constant(stringValue = "pie")
207*795d594fSAndroid Build Coastguard Worker         }
208*795d594fSAndroid Build Coastguard Worker     )
invokeWrongArgumentsAgain()209*795d594fSAndroid Build Coastguard Worker     private static void invokeWrongArgumentsAgain() {
210*795d594fSAndroid Build Coastguard Worker         assertNotReached();
211*795d594fSAndroid Build Coastguard Worker     }
212*795d594fSAndroid Build Coastguard Worker 
wrongArgumentsAgain()213*795d594fSAndroid Build Coastguard Worker     private static void wrongArgumentsAgain() {
214*795d594fSAndroid Build Coastguard Worker         System.out.println("wrongArgumentsAgain");
215*795d594fSAndroid Build Coastguard Worker     }
216*795d594fSAndroid Build Coastguard Worker 
217*795d594fSAndroid Build Coastguard Worker     // Primitive argument types not supported {Z, B, C, S}.
bsmZBCS( MethodHandles.Lookup lookup, String methodName, MethodType methodType, boolean extraArg0, byte extraArg1, char extraArg2, short extraArg3)218*795d594fSAndroid Build Coastguard Worker     private static CallSite bsmZBCS(
219*795d594fSAndroid Build Coastguard Worker             MethodHandles.Lookup lookup,
220*795d594fSAndroid Build Coastguard Worker             String methodName,
221*795d594fSAndroid Build Coastguard Worker             MethodType methodType,
222*795d594fSAndroid Build Coastguard Worker             boolean extraArg0,
223*795d594fSAndroid Build Coastguard Worker             byte extraArg1,
224*795d594fSAndroid Build Coastguard Worker             char extraArg2,
225*795d594fSAndroid Build Coastguard Worker             short extraArg3)
226*795d594fSAndroid Build Coastguard Worker             throws Throwable {
227*795d594fSAndroid Build Coastguard Worker         assertNotReached();
228*795d594fSAndroid Build Coastguard Worker         return null;
229*795d594fSAndroid Build Coastguard Worker     }
230*795d594fSAndroid Build Coastguard Worker 
231*795d594fSAndroid Build Coastguard Worker     // Arguments are narrower than supported.
232*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
233*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
234*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
235*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestBadBootstrapArguments.class,
236*795d594fSAndroid Build Coastguard Worker                     name = "bsmZBCS",
237*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
238*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
239*795d594fSAndroid Build Coastguard Worker                         String.class,
240*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
241*795d594fSAndroid Build Coastguard Worker                         boolean.class,
242*795d594fSAndroid Build Coastguard Worker                         byte.class,
243*795d594fSAndroid Build Coastguard Worker                         char.class,
244*795d594fSAndroid Build Coastguard Worker                         short.class
245*795d594fSAndroid Build Coastguard Worker                     }
246*795d594fSAndroid Build Coastguard Worker                 ),
247*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "narrowArguments",
248*795d594fSAndroid Build Coastguard Worker         constantArgumentsForBootstrapMethod = {
249*795d594fSAndroid Build Coastguard Worker             @Constant(booleanValue = true),
250*795d594fSAndroid Build Coastguard Worker             @Constant(byteValue = Byte.MAX_VALUE),
251*795d594fSAndroid Build Coastguard Worker             @Constant(charValue = 'A'),
252*795d594fSAndroid Build Coastguard Worker             @Constant(shortValue = Short.MIN_VALUE)
253*795d594fSAndroid Build Coastguard Worker         }
254*795d594fSAndroid Build Coastguard Worker     )
invokeNarrowArguments()255*795d594fSAndroid Build Coastguard Worker     private static void invokeNarrowArguments() {
256*795d594fSAndroid Build Coastguard Worker         assertNotReached();
257*795d594fSAndroid Build Coastguard Worker     }
258*795d594fSAndroid Build Coastguard Worker 
narrowArguments()259*795d594fSAndroid Build Coastguard Worker     private static void narrowArguments() {
260*795d594fSAndroid Build Coastguard Worker         assertNotReached();
261*795d594fSAndroid Build Coastguard Worker     }
262*795d594fSAndroid Build Coastguard Worker 
bsmDJ( MethodHandles.Lookup lookup, String methodName, MethodType methodType, double extraArg0, long extraArg1)263*795d594fSAndroid Build Coastguard Worker     private static CallSite bsmDJ(
264*795d594fSAndroid Build Coastguard Worker             MethodHandles.Lookup lookup,
265*795d594fSAndroid Build Coastguard Worker             String methodName,
266*795d594fSAndroid Build Coastguard Worker             MethodType methodType,
267*795d594fSAndroid Build Coastguard Worker             double extraArg0,
268*795d594fSAndroid Build Coastguard Worker             long extraArg1)
269*795d594fSAndroid Build Coastguard Worker             throws Throwable {
270*795d594fSAndroid Build Coastguard Worker         System.out.print("bsmDJ(..., ");
271*795d594fSAndroid Build Coastguard Worker         System.out.print(extraArg0);
272*795d594fSAndroid Build Coastguard Worker         System.out.print(", ");
273*795d594fSAndroid Build Coastguard Worker         System.out.print(extraArg1);
274*795d594fSAndroid Build Coastguard Worker         System.out.println(")");
275*795d594fSAndroid Build Coastguard Worker         MethodHandle mh = lookup.findStatic(lookup.lookupClass(), methodName, methodType);
276*795d594fSAndroid Build Coastguard Worker         return new ConstantCallSite(mh);
277*795d594fSAndroid Build Coastguard Worker     }
278*795d594fSAndroid Build Coastguard Worker 
279*795d594fSAndroid Build Coastguard Worker     // Arguments need widening to parameter types.
280*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
281*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
282*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
283*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestBadBootstrapArguments.class,
284*795d594fSAndroid Build Coastguard Worker                     name = "bsmDJ",
285*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
286*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
287*795d594fSAndroid Build Coastguard Worker                         String.class,
288*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
289*795d594fSAndroid Build Coastguard Worker                         double.class,
290*795d594fSAndroid Build Coastguard Worker                         long.class
291*795d594fSAndroid Build Coastguard Worker                     }
292*795d594fSAndroid Build Coastguard Worker                 ),
293*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "wideningArguments",
294*795d594fSAndroid Build Coastguard Worker         constantArgumentsForBootstrapMethod = {
295*795d594fSAndroid Build Coastguard Worker             @Constant(doubleValue = Double.MAX_VALUE),
296*795d594fSAndroid Build Coastguard Worker             @Constant(intValue = Integer.MAX_VALUE)
297*795d594fSAndroid Build Coastguard Worker         }
298*795d594fSAndroid Build Coastguard Worker     )
invokeWideningArguments()299*795d594fSAndroid Build Coastguard Worker     private static void invokeWideningArguments() {
300*795d594fSAndroid Build Coastguard Worker         assertNotReached();
301*795d594fSAndroid Build Coastguard Worker     }
302*795d594fSAndroid Build Coastguard Worker 
wideningArguments()303*795d594fSAndroid Build Coastguard Worker     private static void wideningArguments() {
304*795d594fSAndroid Build Coastguard Worker         System.out.println("wideningArguments");
305*795d594fSAndroid Build Coastguard Worker     }
306*795d594fSAndroid Build Coastguard Worker 
bsmDoubleLong( MethodHandles.Lookup lookup, String methodName, MethodType methodType, Double extraArg0, Long extraArg1)307*795d594fSAndroid Build Coastguard Worker     private static CallSite bsmDoubleLong(
308*795d594fSAndroid Build Coastguard Worker             MethodHandles.Lookup lookup,
309*795d594fSAndroid Build Coastguard Worker             String methodName,
310*795d594fSAndroid Build Coastguard Worker             MethodType methodType,
311*795d594fSAndroid Build Coastguard Worker             Double extraArg0,
312*795d594fSAndroid Build Coastguard Worker             Long extraArg1)
313*795d594fSAndroid Build Coastguard Worker             throws Throwable {
314*795d594fSAndroid Build Coastguard Worker         System.out.print("bsmDoubleLong(..., ");
315*795d594fSAndroid Build Coastguard Worker         System.out.print(extraArg0);
316*795d594fSAndroid Build Coastguard Worker         System.out.print(", ");
317*795d594fSAndroid Build Coastguard Worker         System.out.print(extraArg1);
318*795d594fSAndroid Build Coastguard Worker         System.out.println(")");
319*795d594fSAndroid Build Coastguard Worker         MethodHandle mh = lookup.findStatic(lookup.lookupClass(), methodName, methodType);
320*795d594fSAndroid Build Coastguard Worker         return new ConstantCallSite(mh);
321*795d594fSAndroid Build Coastguard Worker     }
322*795d594fSAndroid Build Coastguard Worker 
323*795d594fSAndroid Build Coastguard Worker     // Arguments need boxing to parameter types
324*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
325*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
326*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
327*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestBadBootstrapArguments.class,
328*795d594fSAndroid Build Coastguard Worker                     name = "bsmDoubleLong",
329*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
330*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
331*795d594fSAndroid Build Coastguard Worker                         String.class,
332*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
333*795d594fSAndroid Build Coastguard Worker                         Double.class,
334*795d594fSAndroid Build Coastguard Worker                         Long.class
335*795d594fSAndroid Build Coastguard Worker                     }
336*795d594fSAndroid Build Coastguard Worker                 ),
337*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "boxingArguments",
338*795d594fSAndroid Build Coastguard Worker         constantArgumentsForBootstrapMethod = {
339*795d594fSAndroid Build Coastguard Worker             @Constant(doubleValue = Double.MAX_VALUE),
340*795d594fSAndroid Build Coastguard Worker             @Constant(longValue = Long.MAX_VALUE)
341*795d594fSAndroid Build Coastguard Worker         }
342*795d594fSAndroid Build Coastguard Worker     )
invokeBoxingArguments()343*795d594fSAndroid Build Coastguard Worker     private static void invokeBoxingArguments() {
344*795d594fSAndroid Build Coastguard Worker         assertNotReached();
345*795d594fSAndroid Build Coastguard Worker     }
346*795d594fSAndroid Build Coastguard Worker 
boxingArguments()347*795d594fSAndroid Build Coastguard Worker     private static void boxingArguments() {
348*795d594fSAndroid Build Coastguard Worker         System.out.println("boxingArguments");
349*795d594fSAndroid Build Coastguard Worker     }
350*795d594fSAndroid Build Coastguard Worker 
351*795d594fSAndroid Build Coastguard Worker     // Arguments need widening and boxing to parameter types
352*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
353*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
354*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
355*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestBadBootstrapArguments.class,
356*795d594fSAndroid Build Coastguard Worker                     name = "bsmDoubleLong",
357*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
358*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
359*795d594fSAndroid Build Coastguard Worker                         String.class,
360*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
361*795d594fSAndroid Build Coastguard Worker                         Double.class,
362*795d594fSAndroid Build Coastguard Worker                         Long.class
363*795d594fSAndroid Build Coastguard Worker                     }
364*795d594fSAndroid Build Coastguard Worker                 ),
365*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "wideningBoxingArguments",
366*795d594fSAndroid Build Coastguard Worker         constantArgumentsForBootstrapMethod = {
367*795d594fSAndroid Build Coastguard Worker             @Constant(floatValue = Float.MAX_VALUE),
368*795d594fSAndroid Build Coastguard Worker             @Constant(longValue = Integer.MAX_VALUE)
369*795d594fSAndroid Build Coastguard Worker         }
370*795d594fSAndroid Build Coastguard Worker     )
invokeWideningBoxingArguments()371*795d594fSAndroid Build Coastguard Worker     private static void invokeWideningBoxingArguments() {
372*795d594fSAndroid Build Coastguard Worker         assertNotReached();
373*795d594fSAndroid Build Coastguard Worker     }
374*795d594fSAndroid Build Coastguard Worker 
wideningBoxingArguments()375*795d594fSAndroid Build Coastguard Worker     private static void wideningBoxingArguments() {
376*795d594fSAndroid Build Coastguard Worker         System.out.println("wideningBoxingArguments");
377*795d594fSAndroid Build Coastguard Worker     }
378*795d594fSAndroid Build Coastguard Worker 
bsmReturningVoid(MethodHandles.Lookup lookup, String name, MethodType type)379*795d594fSAndroid Build Coastguard Worker     static void bsmReturningVoid(MethodHandles.Lookup lookup, String name, MethodType type) {
380*795d594fSAndroid Build Coastguard Worker         System.out.println("bsm returning void value.");
381*795d594fSAndroid Build Coastguard Worker     }
382*795d594fSAndroid Build Coastguard Worker 
383*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
384*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
385*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
386*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestBadBootstrapArguments.class,
387*795d594fSAndroid Build Coastguard Worker                     name = "bsmReturningVoid",
388*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {MethodHandles.Lookup.class, String.class, MethodType.class},
389*795d594fSAndroid Build Coastguard Worker                     returnType = void.class
390*795d594fSAndroid Build Coastguard Worker                 ),
391*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "voidReturnType"
392*795d594fSAndroid Build Coastguard Worker     )
invokeVoidReturnType()393*795d594fSAndroid Build Coastguard Worker     private static void invokeVoidReturnType() {
394*795d594fSAndroid Build Coastguard Worker         assertNotReached();
395*795d594fSAndroid Build Coastguard Worker     }
396*795d594fSAndroid Build Coastguard Worker 
voidReturnType()397*795d594fSAndroid Build Coastguard Worker     private static void voidReturnType() {
398*795d594fSAndroid Build Coastguard Worker         assertNotReached();
399*795d594fSAndroid Build Coastguard Worker     }
400*795d594fSAndroid Build Coastguard Worker 
bsmReturningObject(MethodHandles.Lookup lookup, String name, MethodType type)401*795d594fSAndroid Build Coastguard Worker     static Object bsmReturningObject(MethodHandles.Lookup lookup, String name, MethodType type) {
402*795d594fSAndroid Build Coastguard Worker         System.out.println("bsm returning Object value.");
403*795d594fSAndroid Build Coastguard Worker         return new Object();
404*795d594fSAndroid Build Coastguard Worker     }
405*795d594fSAndroid Build Coastguard Worker 
406*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
407*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
408*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
409*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestBadBootstrapArguments.class,
410*795d594fSAndroid Build Coastguard Worker                     name = "bsmReturningObject",
411*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {MethodHandles.Lookup.class, String.class, MethodType.class},
412*795d594fSAndroid Build Coastguard Worker                     returnType = Object.class
413*795d594fSAndroid Build Coastguard Worker                 ),
414*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "ObjectReturnType"
415*795d594fSAndroid Build Coastguard Worker     )
invokeObjectReturnType()416*795d594fSAndroid Build Coastguard Worker     private static void invokeObjectReturnType() {
417*795d594fSAndroid Build Coastguard Worker         assertNotReached();
418*795d594fSAndroid Build Coastguard Worker     }
419*795d594fSAndroid Build Coastguard Worker 
objectReturnType()420*795d594fSAndroid Build Coastguard Worker     private static void objectReturnType() {
421*795d594fSAndroid Build Coastguard Worker         assertNotReached();
422*795d594fSAndroid Build Coastguard Worker     }
423*795d594fSAndroid Build Coastguard Worker 
bsmReturningInteger(MethodHandles.Lookup lookup, String name, MethodType type)424*795d594fSAndroid Build Coastguard Worker     static Integer bsmReturningInteger(MethodHandles.Lookup lookup, String name, MethodType type) {
425*795d594fSAndroid Build Coastguard Worker         System.out.println("bsm returning Integer value.");
426*795d594fSAndroid Build Coastguard Worker         return Integer.valueOf(3);
427*795d594fSAndroid Build Coastguard Worker     }
428*795d594fSAndroid Build Coastguard Worker 
429*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
430*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
431*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
432*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestBadBootstrapArguments.class,
433*795d594fSAndroid Build Coastguard Worker                     name = "bsmReturningInteger",
434*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {MethodHandles.Lookup.class, String.class, MethodType.class},
435*795d594fSAndroid Build Coastguard Worker                     returnType = Integer.class
436*795d594fSAndroid Build Coastguard Worker                 ),
437*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "integerReturnType"
438*795d594fSAndroid Build Coastguard Worker     )
invokeIntegerReturnType()439*795d594fSAndroid Build Coastguard Worker     private static void invokeIntegerReturnType() {
440*795d594fSAndroid Build Coastguard Worker         assertNotReached();
441*795d594fSAndroid Build Coastguard Worker     }
442*795d594fSAndroid Build Coastguard Worker 
integerReturnType()443*795d594fSAndroid Build Coastguard Worker     private static void integerReturnType() {
444*795d594fSAndroid Build Coastguard Worker         assertNotReached();
445*795d594fSAndroid Build Coastguard Worker     }
446*795d594fSAndroid Build Coastguard Worker 
447*795d594fSAndroid Build Coastguard Worker     static class TestersConstantCallSite extends ConstantCallSite {
TestersConstantCallSite(MethodHandle mh)448*795d594fSAndroid Build Coastguard Worker         public TestersConstantCallSite(MethodHandle mh) {
449*795d594fSAndroid Build Coastguard Worker             super(mh);
450*795d594fSAndroid Build Coastguard Worker         }
451*795d594fSAndroid Build Coastguard Worker     }
452*795d594fSAndroid Build Coastguard Worker 
bsmReturningTestersConstantCallsite( MethodHandles.Lookup lookup, String name, MethodType type)453*795d594fSAndroid Build Coastguard Worker     static TestersConstantCallSite bsmReturningTestersConstantCallsite(
454*795d594fSAndroid Build Coastguard Worker             MethodHandles.Lookup lookup, String name, MethodType type) throws Throwable {
455*795d594fSAndroid Build Coastguard Worker         return new TestersConstantCallSite(lookup.findStatic(lookup.lookupClass(), name, type));
456*795d594fSAndroid Build Coastguard Worker     }
457*795d594fSAndroid Build Coastguard Worker 
458*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
459*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
460*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
461*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestBadBootstrapArguments.class,
462*795d594fSAndroid Build Coastguard Worker                     name = "bsmReturningTestersConstantCallsite",
463*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {MethodHandles.Lookup.class, String.class, MethodType.class},
464*795d594fSAndroid Build Coastguard Worker                     returnType = TestersConstantCallSite.class
465*795d594fSAndroid Build Coastguard Worker                 ),
466*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "sayHello"
467*795d594fSAndroid Build Coastguard Worker     )
invokeViaCustomCallSiteClass()468*795d594fSAndroid Build Coastguard Worker     private static void invokeViaCustomCallSiteClass() {
469*795d594fSAndroid Build Coastguard Worker         assertNotReached();
470*795d594fSAndroid Build Coastguard Worker     }
471*795d594fSAndroid Build Coastguard Worker 
sayHello()472*795d594fSAndroid Build Coastguard Worker     private static void sayHello() {
473*795d594fSAndroid Build Coastguard Worker         System.out.println("Hello!");
474*795d594fSAndroid Build Coastguard Worker     }
475*795d594fSAndroid Build Coastguard Worker 
test()476*795d594fSAndroid Build Coastguard Worker     static void test() {
477*795d594fSAndroid Build Coastguard Worker         System.out.println("TestBadBootstrapArguments");
478*795d594fSAndroid Build Coastguard Worker         invokeHappy();
479*795d594fSAndroid Build Coastguard Worker         try {
480*795d594fSAndroid Build Coastguard Worker             invokeWrongParameterTypes();
481*795d594fSAndroid Build Coastguard Worker             assertNotReached();
482*795d594fSAndroid Build Coastguard Worker         } catch (NoSuchMethodError expected) {
483*795d594fSAndroid Build Coastguard Worker             System.out.print("invokeWrongParameterTypes => ");
484*795d594fSAndroid Build Coastguard Worker             System.out.println(expected.getClass());
485*795d594fSAndroid Build Coastguard Worker         }
486*795d594fSAndroid Build Coastguard Worker         try {
487*795d594fSAndroid Build Coastguard Worker             invokeMissingParameterTypes();
488*795d594fSAndroid Build Coastguard Worker             assertNotReached();
489*795d594fSAndroid Build Coastguard Worker         } catch (NoSuchMethodError expected) {
490*795d594fSAndroid Build Coastguard Worker             System.out.print("invokeMissingParameterTypes => ");
491*795d594fSAndroid Build Coastguard Worker             System.out.println(expected.getClass());
492*795d594fSAndroid Build Coastguard Worker         }
493*795d594fSAndroid Build Coastguard Worker         try {
494*795d594fSAndroid Build Coastguard Worker             invokeExtraArguments();
495*795d594fSAndroid Build Coastguard Worker             assertNotReached();
496*795d594fSAndroid Build Coastguard Worker         } catch (BootstrapMethodError expected) {
497*795d594fSAndroid Build Coastguard Worker             assertEquals(WrongMethodTypeException.class, expected.getCause().getClass());
498*795d594fSAndroid Build Coastguard Worker             System.out.print("invokeExtraArguments => ");
499*795d594fSAndroid Build Coastguard Worker             System.out.print(expected.getClass());
500*795d594fSAndroid Build Coastguard Worker             System.out.print(" => ");
501*795d594fSAndroid Build Coastguard Worker             System.out.println(expected.getCause().getClass());
502*795d594fSAndroid Build Coastguard Worker         }
503*795d594fSAndroid Build Coastguard Worker         try {
504*795d594fSAndroid Build Coastguard Worker             invokeWrongArguments();
505*795d594fSAndroid Build Coastguard Worker             assertNotReached();
506*795d594fSAndroid Build Coastguard Worker         } catch (BootstrapMethodError expected) {
507*795d594fSAndroid Build Coastguard Worker             assertEquals(ClassCastException.class, expected.getCause().getClass());
508*795d594fSAndroid Build Coastguard Worker             System.out.print("invokeWrongArguments => ");
509*795d594fSAndroid Build Coastguard Worker             System.out.print(expected.getClass());
510*795d594fSAndroid Build Coastguard Worker             System.out.print(" => ");
511*795d594fSAndroid Build Coastguard Worker             System.out.println(expected.getCause().getClass());
512*795d594fSAndroid Build Coastguard Worker         }
513*795d594fSAndroid Build Coastguard Worker         try {
514*795d594fSAndroid Build Coastguard Worker             invokeWrongArguments();
515*795d594fSAndroid Build Coastguard Worker             assertNotReached();
516*795d594fSAndroid Build Coastguard Worker         } catch (BootstrapMethodError expected) {
517*795d594fSAndroid Build Coastguard Worker             assertEquals(ClassCastException.class, expected.getCause().getClass());
518*795d594fSAndroid Build Coastguard Worker             System.out.print("invokeWrongArguments => ");
519*795d594fSAndroid Build Coastguard Worker             System.out.print(expected.getClass());
520*795d594fSAndroid Build Coastguard Worker             System.out.print(" => ");
521*795d594fSAndroid Build Coastguard Worker             System.out.println(expected.getCause().getClass());
522*795d594fSAndroid Build Coastguard Worker         }
523*795d594fSAndroid Build Coastguard Worker         try {
524*795d594fSAndroid Build Coastguard Worker             invokeWrongArgumentsAgain();
525*795d594fSAndroid Build Coastguard Worker             assertNotReached();
526*795d594fSAndroid Build Coastguard Worker         } catch (BootstrapMethodError expected) {
527*795d594fSAndroid Build Coastguard Worker             assertEquals(ClassCastException.class, expected.getCause().getClass());
528*795d594fSAndroid Build Coastguard Worker             System.out.print("invokeWrongArgumentsAgain => ");
529*795d594fSAndroid Build Coastguard Worker             System.out.print(expected.getClass());
530*795d594fSAndroid Build Coastguard Worker             System.out.print(" => ");
531*795d594fSAndroid Build Coastguard Worker             System.out.println(expected.getCause().getClass());
532*795d594fSAndroid Build Coastguard Worker         }
533*795d594fSAndroid Build Coastguard Worker         try {
534*795d594fSAndroid Build Coastguard Worker             invokeNarrowArguments();
535*795d594fSAndroid Build Coastguard Worker             assertNotReached();
536*795d594fSAndroid Build Coastguard Worker         } catch (BootstrapMethodError expected) {
537*795d594fSAndroid Build Coastguard Worker             assertEquals(ClassCastException.class, expected.getCause().getClass());
538*795d594fSAndroid Build Coastguard Worker             System.out.print("invokeNarrowArguments => ");
539*795d594fSAndroid Build Coastguard Worker             System.out.print(expected.getClass());
540*795d594fSAndroid Build Coastguard Worker             System.out.print(" => ");
541*795d594fSAndroid Build Coastguard Worker             System.out.println(expected.getCause().getClass());
542*795d594fSAndroid Build Coastguard Worker         }
543*795d594fSAndroid Build Coastguard Worker         invokeWideningArguments();
544*795d594fSAndroid Build Coastguard Worker         invokeBoxingArguments();
545*795d594fSAndroid Build Coastguard Worker         try {
546*795d594fSAndroid Build Coastguard Worker             invokeWideningBoxingArguments();
547*795d594fSAndroid Build Coastguard Worker             assertNotReached();
548*795d594fSAndroid Build Coastguard Worker         } catch (BootstrapMethodError expected) {
549*795d594fSAndroid Build Coastguard Worker             System.out.print("invokeWideningBoxingArguments => ");
550*795d594fSAndroid Build Coastguard Worker             System.out.print(expected.getClass());
551*795d594fSAndroid Build Coastguard Worker             System.out.print(" => ");
552*795d594fSAndroid Build Coastguard Worker             System.out.println(expected.getCause().getClass());
553*795d594fSAndroid Build Coastguard Worker         }
554*795d594fSAndroid Build Coastguard Worker         try {
555*795d594fSAndroid Build Coastguard Worker             invokeVoidReturnType();
556*795d594fSAndroid Build Coastguard Worker             assertNotReached();
557*795d594fSAndroid Build Coastguard Worker         } catch (BootstrapMethodError expected) {
558*795d594fSAndroid Build Coastguard Worker             System.out.print("invokeVoidReturnType() => ");
559*795d594fSAndroid Build Coastguard Worker             System.out.print(expected.getClass());
560*795d594fSAndroid Build Coastguard Worker             System.out.print(" => ");
561*795d594fSAndroid Build Coastguard Worker             System.out.println(expected.getCause().getClass());
562*795d594fSAndroid Build Coastguard Worker         }
563*795d594fSAndroid Build Coastguard Worker         try {
564*795d594fSAndroid Build Coastguard Worker             invokeObjectReturnType();
565*795d594fSAndroid Build Coastguard Worker             assertNotReached();
566*795d594fSAndroid Build Coastguard Worker         } catch (BootstrapMethodError expected) {
567*795d594fSAndroid Build Coastguard Worker             System.out.print("invokeObjectReturnType() => ");
568*795d594fSAndroid Build Coastguard Worker             System.out.print(expected.getClass());
569*795d594fSAndroid Build Coastguard Worker             System.out.print(" => ");
570*795d594fSAndroid Build Coastguard Worker             System.out.println(expected.getCause().getClass());
571*795d594fSAndroid Build Coastguard Worker         }
572*795d594fSAndroid Build Coastguard Worker         try {
573*795d594fSAndroid Build Coastguard Worker             invokeIntegerReturnType();
574*795d594fSAndroid Build Coastguard Worker             assertNotReached();
575*795d594fSAndroid Build Coastguard Worker         } catch (BootstrapMethodError expected) {
576*795d594fSAndroid Build Coastguard Worker             System.out.print("invokeIntegerReturnType() => ");
577*795d594fSAndroid Build Coastguard Worker             System.out.print(expected.getClass());
578*795d594fSAndroid Build Coastguard Worker             System.out.print(" => ");
579*795d594fSAndroid Build Coastguard Worker             System.out.println(expected.getCause().getClass());
580*795d594fSAndroid Build Coastguard Worker         }
581*795d594fSAndroid Build Coastguard Worker         invokeViaCustomCallSiteClass();
582*795d594fSAndroid Build Coastguard Worker     }
583*795d594fSAndroid Build Coastguard Worker }
584