xref: /aosp_15_r20/dalvik/dx/tests/135-invoke-custom/src/invokecustom/InvokeCustom.java (revision 055d459012065f78d96b68be8421640240ddf631)
1*055d4590SKeyi Gui /*
2*055d4590SKeyi Gui  * Copyright (C) 2017 The Android Open Source Project
3*055d4590SKeyi Gui  *
4*055d4590SKeyi Gui  * Licensed under the Apache License, Version 2.0 (the "License");
5*055d4590SKeyi Gui  * you may not use this file except in compliance with the License.
6*055d4590SKeyi Gui  * You may obtain a copy of the License at
7*055d4590SKeyi Gui  *
8*055d4590SKeyi Gui  *      http://www.apache.org/licenses/LICENSE-2.0
9*055d4590SKeyi Gui  *
10*055d4590SKeyi Gui  * Unless required by applicable law or agreed to in writing, software
11*055d4590SKeyi Gui  * distributed under the License is distributed on an "AS IS" BASIS,
12*055d4590SKeyi Gui  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*055d4590SKeyi Gui  * See the License for the specific language governing permissions and
14*055d4590SKeyi Gui  * limitations under the License.
15*055d4590SKeyi Gui  */
16*055d4590SKeyi Gui 
17*055d4590SKeyi Gui package invokecustom;
18*055d4590SKeyi Gui 
19*055d4590SKeyi Gui import java.lang.invoke.CallSite;
20*055d4590SKeyi Gui import java.lang.invoke.ConstantCallSite;
21*055d4590SKeyi Gui import java.lang.invoke.MethodHandle;
22*055d4590SKeyi Gui import java.lang.invoke.MethodHandles;
23*055d4590SKeyi Gui import java.lang.invoke.MethodType;
24*055d4590SKeyi Gui 
25*055d4590SKeyi Gui import java.util.Arrays;
26*055d4590SKeyi Gui import java.util.List;
27*055d4590SKeyi Gui import java.util.stream.Collectors;
28*055d4590SKeyi Gui 
29*055d4590SKeyi Gui abstract class Super {
targetMethodTest4()30*055d4590SKeyi Gui   public void targetMethodTest4() {
31*055d4590SKeyi Gui     System.out.println("targetMethodTest4 from Super");
32*055d4590SKeyi Gui   }
33*055d4590SKeyi Gui 
helperMethodTest9()34*055d4590SKeyi Gui   public abstract void helperMethodTest9();
35*055d4590SKeyi Gui }
36*055d4590SKeyi Gui 
37*055d4590SKeyi Gui public class InvokeCustom extends Super implements Runnable {
38*055d4590SKeyi Gui 
InvokeCustom()39*055d4590SKeyi Gui   public InvokeCustom() {}
InvokeCustom(int i)40*055d4590SKeyi Gui   public InvokeCustom(int i) {
41*055d4590SKeyi Gui     System.out.println("InvokeCustom.<init>(" + i + ")");
42*055d4590SKeyi Gui   }
43*055d4590SKeyi Gui 
targetMethodTest1()44*055d4590SKeyi Gui   private static void targetMethodTest1() {
45*055d4590SKeyi Gui     System.out.println("Hello World!");
46*055d4590SKeyi Gui   }
47*055d4590SKeyi Gui 
targetMethodTest2(boolean z, byte b, char c, short s, int i, float f, long l, double d, String str)48*055d4590SKeyi Gui   private static void targetMethodTest2(boolean z, byte b, char c, short s, int i, float f, long l,
49*055d4590SKeyi Gui       double d, String str) {
50*055d4590SKeyi Gui     System.out.println(z);
51*055d4590SKeyi Gui     System.out.println(b);
52*055d4590SKeyi Gui     System.out.println(c);
53*055d4590SKeyi Gui     System.out.println(s);
54*055d4590SKeyi Gui     System.out.println(i);
55*055d4590SKeyi Gui     System.out.println(f);
56*055d4590SKeyi Gui     System.out.println(l);
57*055d4590SKeyi Gui     System.out.println(d);
58*055d4590SKeyi Gui     System.out.println(str);
59*055d4590SKeyi Gui   }
60*055d4590SKeyi Gui 
targetMethodTest3()61*055d4590SKeyi Gui   private static void targetMethodTest3() {
62*055d4590SKeyi Gui     System.out.println("targetMethodTest3 from InvokeCustom");
63*055d4590SKeyi Gui   }
64*055d4590SKeyi Gui 
65*055d4590SKeyi Gui   @Override
targetMethodTest4()66*055d4590SKeyi Gui   public void targetMethodTest4() {
67*055d4590SKeyi Gui     // The generated code should be calling Super.targetMethodTest4.
68*055d4590SKeyi Gui     System.out.println("targetMethodTest4 from InvokeCustom (oops!)");
69*055d4590SKeyi Gui   }
70*055d4590SKeyi Gui 
targetMethodTest5(int x, int y, int total)71*055d4590SKeyi Gui   public static int targetMethodTest5(int x, int y, int total) {
72*055d4590SKeyi Gui     int calculated = x + y;
73*055d4590SKeyi Gui     System.out.println("targetMethodTest5 " + x + " + " + y + " = " + calculated);
74*055d4590SKeyi Gui     if (calculated != total) {
75*055d4590SKeyi Gui         System.out.println("Failed " + calculated + " != " + total);
76*055d4590SKeyi Gui     }
77*055d4590SKeyi Gui     return calculated;
78*055d4590SKeyi Gui   }
79*055d4590SKeyi Gui 
targetMethodTest6(long x, long y, long total)80*055d4590SKeyi Gui   public static long targetMethodTest6(long x, long y, long total) {
81*055d4590SKeyi Gui     long calculated = x + y;
82*055d4590SKeyi Gui     System.out.println("targetMethodTest6 " + x + " + " + y + " = " + calculated);
83*055d4590SKeyi Gui     if (calculated != total) {
84*055d4590SKeyi Gui         System.out.println("Failed " + calculated + " != " + total);
85*055d4590SKeyi Gui     }
86*055d4590SKeyi Gui     return calculated;
87*055d4590SKeyi Gui   }
88*055d4590SKeyi Gui 
targetMethodTest7(float x, float y, double product)89*055d4590SKeyi Gui   public static double targetMethodTest7(float x, float y, double product) {
90*055d4590SKeyi Gui     double calculated = x * y;
91*055d4590SKeyi Gui     System.out.println("targetMethodTest7 " + x + " * " + y + " = " + calculated);
92*055d4590SKeyi Gui     if (calculated != product) {
93*055d4590SKeyi Gui       System.out.println("Failed " + calculated + " != " + product);
94*055d4590SKeyi Gui     }
95*055d4590SKeyi Gui     return calculated;
96*055d4590SKeyi Gui   }
97*055d4590SKeyi Gui 
targetMethodTest8(String s)98*055d4590SKeyi Gui   public static void targetMethodTest8(String s) {
99*055d4590SKeyi Gui     System.out.println("targetMethodTest8 " + s);
100*055d4590SKeyi Gui   }
101*055d4590SKeyi Gui 
102*055d4590SKeyi Gui   private static int staticFieldTest9 = 0;
103*055d4590SKeyi Gui 
checkStaticFieldTest9(MethodHandle getter, MethodHandle setter)104*055d4590SKeyi Gui   private static void checkStaticFieldTest9(MethodHandle getter, MethodHandle setter)
105*055d4590SKeyi Gui       throws Throwable {
106*055d4590SKeyi Gui     final int NEW_VALUE = 0x76543210;
107*055d4590SKeyi Gui     int oldValue = (int) getter.invokeExact();
108*055d4590SKeyi Gui     setter.invokeExact(NEW_VALUE);
109*055d4590SKeyi Gui     int newValue = (int) getter.invokeExact();
110*055d4590SKeyi Gui     System.out.print("checkStaticFieldTest9: old " + oldValue + " new " + newValue +
111*055d4590SKeyi Gui                      " expected " + NEW_VALUE + " ");
112*055d4590SKeyi Gui     System.out.println((newValue == NEW_VALUE) ? "OK" : "ERROR");
113*055d4590SKeyi Gui   }
114*055d4590SKeyi Gui 
115*055d4590SKeyi Gui   private float fieldTest9 = 0.0f;
116*055d4590SKeyi Gui 
checkFieldTest9(MethodHandle getter, MethodHandle setter)117*055d4590SKeyi Gui   private void checkFieldTest9(MethodHandle getter, MethodHandle setter)
118*055d4590SKeyi Gui       throws Throwable {
119*055d4590SKeyi Gui     final float NEW_VALUE = 1.99e-19f;
120*055d4590SKeyi Gui     float oldValue = (float) getter.invokeExact(this);
121*055d4590SKeyi Gui     setter.invokeExact(this, NEW_VALUE);
122*055d4590SKeyi Gui     float newValue = (float) getter.invokeExact(this);
123*055d4590SKeyi Gui     System.out.print("checkFieldTest9: old " + oldValue + " new " + newValue +
124*055d4590SKeyi Gui                      " expected " + NEW_VALUE + " ");
125*055d4590SKeyi Gui     System.out.println((newValue == NEW_VALUE) ? "OK" : "ERROR");
126*055d4590SKeyi Gui   }
127*055d4590SKeyi Gui 
helperMethodTest9()128*055d4590SKeyi Gui   public void helperMethodTest9() {
129*055d4590SKeyi Gui     System.out.println("helperMethodTest9 in " + InvokeCustom.class);
130*055d4590SKeyi Gui   }
131*055d4590SKeyi Gui 
targetMethodTest9()132*055d4590SKeyi Gui   private static void targetMethodTest9() {
133*055d4590SKeyi Gui     System.out.println("targetMethodTest9()");
134*055d4590SKeyi Gui   }
135*055d4590SKeyi Gui 
run()136*055d4590SKeyi Gui   public void run() {
137*055d4590SKeyi Gui     System.out.println("run() for Test9");
138*055d4590SKeyi Gui   }
139*055d4590SKeyi Gui 
bsmLookupStatic(MethodHandles.Lookup caller, String name, MethodType type)140*055d4590SKeyi Gui   public static CallSite bsmLookupStatic(MethodHandles.Lookup caller, String name, MethodType type)
141*055d4590SKeyi Gui       throws NoSuchMethodException, IllegalAccessException {
142*055d4590SKeyi Gui     System.out.println("bsmLookupStatic []");
143*055d4590SKeyi Gui     final MethodHandles.Lookup lookup = MethodHandles.lookup();
144*055d4590SKeyi Gui     final MethodHandle targetMH = lookup.findStatic(lookup.lookupClass(), name, type);
145*055d4590SKeyi Gui     return new ConstantCallSite(targetMH.asType(type));
146*055d4590SKeyi Gui   }
147*055d4590SKeyi Gui 
bsmLookupStaticWithExtraArgs( MethodHandles.Lookup caller, String name, MethodType type, int i, long l, float f, double d)148*055d4590SKeyi Gui   public static CallSite bsmLookupStaticWithExtraArgs(
149*055d4590SKeyi Gui       MethodHandles.Lookup caller, String name, MethodType type, int i, long l, float f, double d)
150*055d4590SKeyi Gui       throws NoSuchMethodException, IllegalAccessException {
151*055d4590SKeyi Gui     System.out.println("bsmLookupStaticWithExtraArgs [" + i + ", " + l + ", " + f + ", " + d + "]");
152*055d4590SKeyi Gui     final MethodHandles.Lookup lookup = MethodHandles.lookup();
153*055d4590SKeyi Gui     final MethodHandle targetMH = lookup.findStatic(lookup.lookupClass(), name, type);
154*055d4590SKeyi Gui     return new ConstantCallSite(targetMH.asType(type));
155*055d4590SKeyi Gui   }
156*055d4590SKeyi Gui 
bsmCreateCallSite( MethodHandles.Lookup caller, String name, MethodType type, MethodHandle mh)157*055d4590SKeyi Gui   public static CallSite bsmCreateCallSite(
158*055d4590SKeyi Gui       MethodHandles.Lookup caller, String name, MethodType type, MethodHandle mh)
159*055d4590SKeyi Gui       throws Throwable {
160*055d4590SKeyi Gui     System.out.println("bsmCreateCallSite [" + mh + "]");
161*055d4590SKeyi Gui     return new ConstantCallSite(mh);
162*055d4590SKeyi Gui   }
163*055d4590SKeyi Gui 
privateMethodTest9()164*055d4590SKeyi Gui   private void privateMethodTest9() {
165*055d4590SKeyi Gui     System.out.println("InvokeCustom.privateMethodTest9()");
166*055d4590SKeyi Gui   }
167*055d4590SKeyi Gui 
bsmLookupTest9(MethodHandles.Lookup caller, String name, MethodType type, MethodHandle staticGetter, MethodHandle staticSetter, MethodHandle fieldGetter, MethodHandle fieldSetter, MethodHandle instanceInvoke, MethodHandle constructor, MethodHandle interfaceInvoke, MethodHandle privateInvoke)168*055d4590SKeyi Gui   public static CallSite bsmLookupTest9(MethodHandles.Lookup caller, String name, MethodType type,
169*055d4590SKeyi Gui                                         MethodHandle staticGetter,  MethodHandle staticSetter,
170*055d4590SKeyi Gui                                         MethodHandle fieldGetter, MethodHandle fieldSetter,
171*055d4590SKeyi Gui                                         MethodHandle instanceInvoke, MethodHandle constructor,
172*055d4590SKeyi Gui                                         MethodHandle interfaceInvoke, MethodHandle privateInvoke)
173*055d4590SKeyi Gui           throws Throwable {
174*055d4590SKeyi Gui     System.out.println("bsmLookupTest9 [" + staticGetter + ", " + staticSetter + ", " +
175*055d4590SKeyi Gui                        fieldGetter + ", " + fieldSetter + "]");
176*055d4590SKeyi Gui     System.out.println(name + " " + type);
177*055d4590SKeyi Gui 
178*055d4590SKeyi Gui     // Check constant method handles passed can be invoked.
179*055d4590SKeyi Gui     checkStaticFieldTest9(staticGetter, staticSetter);
180*055d4590SKeyi Gui     InvokeCustom instance = new InvokeCustom();
181*055d4590SKeyi Gui     instance.checkFieldTest9(fieldGetter, fieldSetter);
182*055d4590SKeyi Gui 
183*055d4590SKeyi Gui     // Check virtual method.
184*055d4590SKeyi Gui     instanceInvoke.invokeExact(instance);
185*055d4590SKeyi Gui 
186*055d4590SKeyi Gui     InvokeCustom instance2 = (InvokeCustom) constructor.invokeExact(3);
187*055d4590SKeyi Gui     interfaceInvoke.invoke(instance2);
188*055d4590SKeyi Gui     privateInvoke.invoke(instance2);
189*055d4590SKeyi Gui 
190*055d4590SKeyi Gui     final MethodHandles.Lookup lookup = MethodHandles.lookup();
191*055d4590SKeyi Gui     final MethodHandle targetMH = lookup.findStatic(lookup.lookupClass(), name, type);
192*055d4590SKeyi Gui     return new ConstantCallSite(targetMH.asType(type));
193*055d4590SKeyi Gui   }
194*055d4590SKeyi Gui 
lambdaTest()195*055d4590SKeyi Gui   public static void lambdaTest() {
196*055d4590SKeyi Gui     List<String> strings = Arrays.asList(new String[] { "Three", "One", "FortyTwo" });
197*055d4590SKeyi Gui     String sample = strings.stream().filter(x -> "One".equals(x.trim()))
198*055d4590SKeyi Gui         .map(String::trim).findAny().orElse("");
199*055d4590SKeyi Gui     strings.stream().forEach(System.out::println);
200*055d4590SKeyi Gui   }
201*055d4590SKeyi Gui }
202