xref: /aosp_15_r20/dalvik/dx/tests/137-dexmerger-dex38/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 abstract class Super {
targetMethodTest4()26*055d4590SKeyi Gui   public void targetMethodTest4() {
27*055d4590SKeyi Gui     System.out.println("targetMethodTest4 from Super");
28*055d4590SKeyi Gui   }
29*055d4590SKeyi Gui 
helperMethodTest9()30*055d4590SKeyi Gui   public abstract void helperMethodTest9();
31*055d4590SKeyi Gui }
32*055d4590SKeyi Gui 
33*055d4590SKeyi Gui public class InvokeCustom extends Super implements Runnable {
34*055d4590SKeyi Gui 
InvokeCustom()35*055d4590SKeyi Gui   public InvokeCustom() {}
InvokeCustom(int i)36*055d4590SKeyi Gui   public InvokeCustom(int i) {
37*055d4590SKeyi Gui     System.out.println("InvokeCustom.<init>(" + i + ")");
38*055d4590SKeyi Gui   }
39*055d4590SKeyi Gui 
targetMethodTest1()40*055d4590SKeyi Gui   private static void targetMethodTest1() {
41*055d4590SKeyi Gui     System.out.println("Hello World!");
42*055d4590SKeyi Gui   }
43*055d4590SKeyi Gui 
targetMethodTest2(boolean z, byte b, char c, short s, int i, float f, long l, double d, String str)44*055d4590SKeyi Gui   private static void targetMethodTest2(boolean z, byte b, char c, short s, int i, float f, long l,
45*055d4590SKeyi Gui       double d, String str) {
46*055d4590SKeyi Gui     System.out.println(z);
47*055d4590SKeyi Gui     System.out.println(b);
48*055d4590SKeyi Gui     System.out.println(c);
49*055d4590SKeyi Gui     System.out.println(s);
50*055d4590SKeyi Gui     System.out.println(i);
51*055d4590SKeyi Gui     System.out.println(f);
52*055d4590SKeyi Gui     System.out.println(l);
53*055d4590SKeyi Gui     System.out.println(d);
54*055d4590SKeyi Gui     System.out.println(str);
55*055d4590SKeyi Gui   }
56*055d4590SKeyi Gui 
targetMethodTest3()57*055d4590SKeyi Gui   private static void targetMethodTest3() {
58*055d4590SKeyi Gui     System.out.println("targetMethodTest3 from InvokeCustom");
59*055d4590SKeyi Gui   }
60*055d4590SKeyi Gui 
61*055d4590SKeyi Gui   @Override
targetMethodTest4()62*055d4590SKeyi Gui   public void targetMethodTest4() {
63*055d4590SKeyi Gui     // The generated code should be calling Super.targetMethodTest4.
64*055d4590SKeyi Gui     System.out.println("targetMethodTest4 from InvokeCustom (oops!)");
65*055d4590SKeyi Gui   }
66*055d4590SKeyi Gui 
targetMethodTest5(int x, int y, int total)67*055d4590SKeyi Gui   public static int targetMethodTest5(int x, int y, int total) {
68*055d4590SKeyi Gui     int calculated = x + y;
69*055d4590SKeyi Gui     System.out.println("targetMethodTest5 " + x + " + " + y + " = " + calculated);
70*055d4590SKeyi Gui     if (calculated != total) {
71*055d4590SKeyi Gui         System.out.println("Failed " + calculated + " != " + total);
72*055d4590SKeyi Gui     }
73*055d4590SKeyi Gui     return calculated;
74*055d4590SKeyi Gui   }
75*055d4590SKeyi Gui 
targetMethodTest6(long x, long y, long total)76*055d4590SKeyi Gui   public static long targetMethodTest6(long x, long y, long total) {
77*055d4590SKeyi Gui     long calculated = x + y;
78*055d4590SKeyi Gui     System.out.println("targetMethodTest6 " + x + " + " + y + " = " + calculated);
79*055d4590SKeyi Gui     if (calculated != total) {
80*055d4590SKeyi Gui         System.out.println("Failed " + calculated + " != " + total);
81*055d4590SKeyi Gui     }
82*055d4590SKeyi Gui     return calculated;
83*055d4590SKeyi Gui   }
84*055d4590SKeyi Gui 
targetMethodTest7(float x, float y, double product)85*055d4590SKeyi Gui   public static double targetMethodTest7(float x, float y, double product) {
86*055d4590SKeyi Gui     double calculated = x * y;
87*055d4590SKeyi Gui     System.out.println("targetMethodTest7 " + x + " * " + y + " = " + calculated);
88*055d4590SKeyi Gui     if (calculated != product) {
89*055d4590SKeyi Gui       System.out.println("Failed " + calculated + " != " + product);
90*055d4590SKeyi Gui     }
91*055d4590SKeyi Gui     return calculated;
92*055d4590SKeyi Gui   }
93*055d4590SKeyi Gui 
targetMethodTest8(String s)94*055d4590SKeyi Gui   public static void targetMethodTest8(String s) {
95*055d4590SKeyi Gui     System.out.println("targetMethodTest8 " + s);
96*055d4590SKeyi Gui   }
97*055d4590SKeyi Gui 
98*055d4590SKeyi Gui   private static int staticFieldTest9 = 0;
99*055d4590SKeyi Gui 
checkStaticFieldTest9(MethodHandle getter, MethodHandle setter)100*055d4590SKeyi Gui   private static void checkStaticFieldTest9(MethodHandle getter, MethodHandle setter)
101*055d4590SKeyi Gui       throws Throwable {
102*055d4590SKeyi Gui     final int NEW_VALUE = 0x76543210;
103*055d4590SKeyi Gui     int oldValue = (int) getter.invokeExact();
104*055d4590SKeyi Gui     setter.invokeExact(NEW_VALUE);
105*055d4590SKeyi Gui     int newValue = (int) getter.invokeExact();
106*055d4590SKeyi Gui     System.out.print("checkStaticFieldTest9: old " + oldValue + " new " + newValue +
107*055d4590SKeyi Gui                      " expected " + NEW_VALUE + " ");
108*055d4590SKeyi Gui     System.out.println((newValue == NEW_VALUE) ? "OK" : "ERROR");
109*055d4590SKeyi Gui   }
110*055d4590SKeyi Gui 
111*055d4590SKeyi Gui   private float fieldTest9 = 0.0f;
112*055d4590SKeyi Gui 
checkFieldTest9(MethodHandle getter, MethodHandle setter)113*055d4590SKeyi Gui   private void checkFieldTest9(MethodHandle getter, MethodHandle setter)
114*055d4590SKeyi Gui       throws Throwable {
115*055d4590SKeyi Gui     final float NEW_VALUE = 1.99e-19f;
116*055d4590SKeyi Gui     float oldValue = (float) getter.invokeExact(this);
117*055d4590SKeyi Gui     setter.invokeExact(this, NEW_VALUE);
118*055d4590SKeyi Gui     float newValue = (float) getter.invokeExact(this);
119*055d4590SKeyi Gui     System.out.print("checkFieldTest9: old " + oldValue + " new " + newValue +
120*055d4590SKeyi Gui                      " expected " + NEW_VALUE + " ");
121*055d4590SKeyi Gui     System.out.println((newValue == NEW_VALUE) ? "OK" : "ERROR");
122*055d4590SKeyi Gui   }
123*055d4590SKeyi Gui 
helperMethodTest9()124*055d4590SKeyi Gui   public void helperMethodTest9() {
125*055d4590SKeyi Gui     System.out.println("helperMethodTest9 in " + InvokeCustom.class);
126*055d4590SKeyi Gui   }
127*055d4590SKeyi Gui 
targetMethodTest9()128*055d4590SKeyi Gui   private static void targetMethodTest9() {
129*055d4590SKeyi Gui     System.out.println("targetMethodTest9()");
130*055d4590SKeyi Gui   }
131*055d4590SKeyi Gui 
run()132*055d4590SKeyi Gui   public void run() {
133*055d4590SKeyi Gui     System.out.println("run() for Test9");
134*055d4590SKeyi Gui   }
135*055d4590SKeyi Gui 
bsmLookupStatic(MethodHandles.Lookup caller, String name, MethodType type)136*055d4590SKeyi Gui   public static CallSite bsmLookupStatic(MethodHandles.Lookup caller, String name, MethodType type)
137*055d4590SKeyi Gui       throws NoSuchMethodException, IllegalAccessException {
138*055d4590SKeyi Gui     System.out.println("bsmLookupStatic []");
139*055d4590SKeyi Gui     final MethodHandles.Lookup lookup = MethodHandles.lookup();
140*055d4590SKeyi Gui     final MethodHandle targetMH = lookup.findStatic(lookup.lookupClass(), name, type);
141*055d4590SKeyi Gui     return new ConstantCallSite(targetMH.asType(type));
142*055d4590SKeyi Gui   }
143*055d4590SKeyi Gui 
bsmLookupStaticWithExtraArgs( MethodHandles.Lookup caller, String name, MethodType type, int i, long l, float f, double d)144*055d4590SKeyi Gui   public static CallSite bsmLookupStaticWithExtraArgs(
145*055d4590SKeyi Gui       MethodHandles.Lookup caller, String name, MethodType type, int i, long l, float f, double d)
146*055d4590SKeyi Gui       throws NoSuchMethodException, IllegalAccessException {
147*055d4590SKeyi Gui     System.out.println("bsmLookupStaticWithExtraArgs [" + i + ", " + l + ", " + f + ", " + d + "]");
148*055d4590SKeyi Gui     final MethodHandles.Lookup lookup = MethodHandles.lookup();
149*055d4590SKeyi Gui     final MethodHandle targetMH = lookup.findStatic(lookup.lookupClass(), name, type);
150*055d4590SKeyi Gui     return new ConstantCallSite(targetMH.asType(type));
151*055d4590SKeyi Gui   }
152*055d4590SKeyi Gui 
bsmCreateCallSite( MethodHandles.Lookup caller, String name, MethodType type, MethodHandle mh)153*055d4590SKeyi Gui   public static CallSite bsmCreateCallSite(
154*055d4590SKeyi Gui       MethodHandles.Lookup caller, String name, MethodType type, MethodHandle mh)
155*055d4590SKeyi Gui       throws Throwable {
156*055d4590SKeyi Gui     System.out.println("bsmCreateCallSite [" + mh + "]");
157*055d4590SKeyi Gui     return new ConstantCallSite(mh);
158*055d4590SKeyi Gui   }
159*055d4590SKeyi Gui 
bsmLookupTest9(MethodHandles.Lookup caller, String name, MethodType type, MethodHandle staticGetter, MethodHandle staticSetter, MethodHandle fieldGetter, MethodHandle fieldSetter, MethodHandle instanceInvoke, MethodHandle constructor, MethodHandle interfaceInvoke)160*055d4590SKeyi Gui   public static CallSite bsmLookupTest9(MethodHandles.Lookup caller, String name, MethodType type,
161*055d4590SKeyi Gui                                         MethodHandle staticGetter,  MethodHandle staticSetter,
162*055d4590SKeyi Gui                                         MethodHandle fieldGetter, MethodHandle fieldSetter,
163*055d4590SKeyi Gui                                         MethodHandle instanceInvoke, MethodHandle constructor,
164*055d4590SKeyi Gui                                         MethodHandle interfaceInvoke)
165*055d4590SKeyi Gui           throws Throwable {
166*055d4590SKeyi Gui     System.out.println("bsmLookupTest9 [" + staticGetter + ", " + staticSetter + ", " +
167*055d4590SKeyi Gui                        fieldGetter + ", " + fieldSetter + "]");
168*055d4590SKeyi Gui     System.out.println(name + " " + type);
169*055d4590SKeyi Gui 
170*055d4590SKeyi Gui     // Check constant method handles passed can be invoked.
171*055d4590SKeyi Gui     checkStaticFieldTest9(staticGetter, staticSetter);
172*055d4590SKeyi Gui     InvokeCustom instance = new InvokeCustom();
173*055d4590SKeyi Gui     instance.checkFieldTest9(fieldGetter, fieldSetter);
174*055d4590SKeyi Gui 
175*055d4590SKeyi Gui     // Check virtual method.
176*055d4590SKeyi Gui     instanceInvoke.invokeExact(instance);
177*055d4590SKeyi Gui 
178*055d4590SKeyi Gui     InvokeCustom instance2 = (InvokeCustom) constructor.invokeExact(3);
179*055d4590SKeyi Gui     interfaceInvoke.invoke(instance2);
180*055d4590SKeyi Gui 
181*055d4590SKeyi Gui     final MethodHandles.Lookup lookup = MethodHandles.lookup();
182*055d4590SKeyi Gui     final MethodHandle targetMH = lookup.findStatic(lookup.lookupClass(), name, type);
183*055d4590SKeyi Gui     return new ConstantCallSite(targetMH.asType(type));
184*055d4590SKeyi Gui   }
185*055d4590SKeyi Gui }
186