xref: /aosp_15_r20/art/test/952-invoke-custom/src/TestDynamicBootstrapArguments.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 
26*795d594fSAndroid Build Coastguard Worker class TestDynamicBootstrapArguments extends TestBase {
27*795d594fSAndroid Build Coastguard Worker     private static int bsmCalls = 0;
28*795d594fSAndroid Build Coastguard Worker 
bsm( MethodHandles.Lookup lookup, String name, MethodType methodType, String otherNameComponent, long nameSuffix)29*795d594fSAndroid Build Coastguard Worker     static CallSite bsm(
30*795d594fSAndroid Build Coastguard Worker             MethodHandles.Lookup lookup,
31*795d594fSAndroid Build Coastguard Worker             String name,
32*795d594fSAndroid Build Coastguard Worker             MethodType methodType,
33*795d594fSAndroid Build Coastguard Worker             String otherNameComponent,
34*795d594fSAndroid Build Coastguard Worker             long nameSuffix)
35*795d594fSAndroid Build Coastguard Worker             throws Throwable {
36*795d594fSAndroid Build Coastguard Worker         bsmCalls = bsmCalls + 1;
37*795d594fSAndroid Build Coastguard Worker         Class<?> definingClass = TestDynamicBootstrapArguments.class;
38*795d594fSAndroid Build Coastguard Worker         String methodName = name + otherNameComponent + nameSuffix;
39*795d594fSAndroid Build Coastguard Worker         MethodHandle mh = lookup.findStatic(definingClass, methodName, methodType);
40*795d594fSAndroid Build Coastguard Worker         System.out.println("bsm");
41*795d594fSAndroid Build Coastguard Worker         return new ConstantCallSite(mh);
42*795d594fSAndroid Build Coastguard Worker     }
43*795d594fSAndroid Build Coastguard Worker 
44*795d594fSAndroid Build Coastguard Worker     @CalledByIndy(
45*795d594fSAndroid Build Coastguard Worker         bootstrapMethod =
46*795d594fSAndroid Build Coastguard Worker                 @BootstrapMethod(
47*795d594fSAndroid Build Coastguard Worker                     enclosingType = TestDynamicBootstrapArguments.class,
48*795d594fSAndroid Build Coastguard Worker                     name = "bsm",
49*795d594fSAndroid Build Coastguard Worker                     parameterTypes = {
50*795d594fSAndroid Build Coastguard Worker                         MethodHandles.Lookup.class,
51*795d594fSAndroid Build Coastguard Worker                         String.class,
52*795d594fSAndroid Build Coastguard Worker                         MethodType.class,
53*795d594fSAndroid Build Coastguard Worker                         String.class,
54*795d594fSAndroid Build Coastguard Worker                         long.class
55*795d594fSAndroid Build Coastguard Worker                     }
56*795d594fSAndroid Build Coastguard Worker                 ),
57*795d594fSAndroid Build Coastguard Worker         fieldOrMethodName = "target",
58*795d594fSAndroid Build Coastguard Worker         returnType = int.class,
59*795d594fSAndroid Build Coastguard Worker         parameterTypes = {int.class, String.class, double.class},
60*795d594fSAndroid Build Coastguard Worker         constantArgumentsForBootstrapMethod = {
61*795d594fSAndroid Build Coastguard Worker             @Constant(stringValue = "A"),
62*795d594fSAndroid Build Coastguard Worker             @Constant(longValue = 100000000l)
63*795d594fSAndroid Build Coastguard Worker         }
64*795d594fSAndroid Build Coastguard Worker     )
testDynamic(int i, String s, Double d)65*795d594fSAndroid Build Coastguard Worker     private static int testDynamic(int i, String s, Double d) {
66*795d594fSAndroid Build Coastguard Worker         assertNotReached();
67*795d594fSAndroid Build Coastguard Worker         return 0;
68*795d594fSAndroid Build Coastguard Worker     }
69*795d594fSAndroid Build Coastguard Worker 
targetA100000000(int i, String s, Double d)70*795d594fSAndroid Build Coastguard Worker     private static int targetA100000000(int i, String s, Double d) {
71*795d594fSAndroid Build Coastguard Worker         System.out.print(i);
72*795d594fSAndroid Build Coastguard Worker         System.out.print(", ");
73*795d594fSAndroid Build Coastguard Worker         System.out.print(s);
74*795d594fSAndroid Build Coastguard Worker         System.out.print(", ");
75*795d594fSAndroid Build Coastguard Worker         System.out.println(d);
76*795d594fSAndroid Build Coastguard Worker         return i;
77*795d594fSAndroid Build Coastguard Worker     }
78*795d594fSAndroid Build Coastguard Worker 
testCallSites()79*795d594fSAndroid Build Coastguard Worker     static void testCallSites() {
80*795d594fSAndroid Build Coastguard Worker         assertEquals(0, testDynamic(0, "One", Math.PI));
81*795d594fSAndroid Build Coastguard Worker         assertEquals(1, testDynamic(1, "Two", Math.E));
82*795d594fSAndroid Build Coastguard Worker         assertEquals(2, testDynamic(2, "Three", 0.0));
83*795d594fSAndroid Build Coastguard Worker     }
84*795d594fSAndroid Build Coastguard Worker 
test()85*795d594fSAndroid Build Coastguard Worker     static void test() {
86*795d594fSAndroid Build Coastguard Worker         System.out.println("TestDynamicArguments");
87*795d594fSAndroid Build Coastguard Worker         testCallSites();
88*795d594fSAndroid Build Coastguard Worker         assertEquals(3, bsmCalls);
89*795d594fSAndroid Build Coastguard Worker         testCallSites();
90*795d594fSAndroid Build Coastguard Worker         assertEquals(3, bsmCalls);
91*795d594fSAndroid Build Coastguard Worker     }
92*795d594fSAndroid Build Coastguard Worker }
93