xref: /aosp_15_r20/art/test/953-invoke-polymorphic-compiler/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2016 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 java.lang.invoke.MethodHandle;
18*795d594fSAndroid Build Coastguard Worker import java.lang.invoke.MethodHandles;
19*795d594fSAndroid Build Coastguard Worker import java.lang.invoke.MethodHandles.Lookup;
20*795d594fSAndroid Build Coastguard Worker import java.lang.invoke.MethodType;
21*795d594fSAndroid Build Coastguard Worker import java.lang.invoke.WrongMethodTypeException;
22*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.Constructor;
23*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.Field;
24*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.Method;
25*795d594fSAndroid Build Coastguard Worker import java.nio.charset.Charset;
26*795d594fSAndroid Build Coastguard Worker import java.nio.charset.StandardCharsets;
27*795d594fSAndroid Build Coastguard Worker import java.util.ArrayList;
28*795d594fSAndroid Build Coastguard Worker import java.util.Arrays;
29*795d594fSAndroid Build Coastguard Worker import java.util.List;
30*795d594fSAndroid Build Coastguard Worker 
31*795d594fSAndroid Build Coastguard Worker public class Main {
assertTrue(boolean value)32*795d594fSAndroid Build Coastguard Worker   public static void assertTrue(boolean value) {
33*795d594fSAndroid Build Coastguard Worker     if (!value) {
34*795d594fSAndroid Build Coastguard Worker       throw new AssertionError("assertTrue value: " + value);
35*795d594fSAndroid Build Coastguard Worker     }
36*795d594fSAndroid Build Coastguard Worker   }
37*795d594fSAndroid Build Coastguard Worker 
assertFalse(boolean value)38*795d594fSAndroid Build Coastguard Worker   public static void assertFalse(boolean value) {
39*795d594fSAndroid Build Coastguard Worker     if (value) {
40*795d594fSAndroid Build Coastguard Worker       throw new AssertionError("assertTrue value: " + value);
41*795d594fSAndroid Build Coastguard Worker     }
42*795d594fSAndroid Build Coastguard Worker   }
43*795d594fSAndroid Build Coastguard Worker 
assertEquals(int i1, int i2)44*795d594fSAndroid Build Coastguard Worker   public static void assertEquals(int i1, int i2) {
45*795d594fSAndroid Build Coastguard Worker     if (i1 == i2) { return; }
46*795d594fSAndroid Build Coastguard Worker     throw new AssertionError("assertEquals i1: " + i1 + ", i2: " + i2);
47*795d594fSAndroid Build Coastguard Worker   }
48*795d594fSAndroid Build Coastguard Worker 
assertEquals(long i1, long i2)49*795d594fSAndroid Build Coastguard Worker   public static void assertEquals(long i1, long i2) {
50*795d594fSAndroid Build Coastguard Worker     if (i1 == i2) { return; }
51*795d594fSAndroid Build Coastguard Worker     throw new AssertionError("assertEquals l1: " + i1 + ", l2: " + i2);
52*795d594fSAndroid Build Coastguard Worker   }
53*795d594fSAndroid Build Coastguard Worker 
assertEquals(Object o, Object p)54*795d594fSAndroid Build Coastguard Worker   public static void assertEquals(Object o, Object p) {
55*795d594fSAndroid Build Coastguard Worker     if (o == p) { return; }
56*795d594fSAndroid Build Coastguard Worker     if (o != null && p != null && o.equals(p)) { return; }
57*795d594fSAndroid Build Coastguard Worker     throw new AssertionError("assertEquals: o1: " + o + ", o2: " + p);
58*795d594fSAndroid Build Coastguard Worker   }
59*795d594fSAndroid Build Coastguard Worker 
assertEquals(String s1, String s2)60*795d594fSAndroid Build Coastguard Worker   public static void assertEquals(String s1, String s2) {
61*795d594fSAndroid Build Coastguard Worker     if (s1 == s2) {
62*795d594fSAndroid Build Coastguard Worker       return;
63*795d594fSAndroid Build Coastguard Worker     }
64*795d594fSAndroid Build Coastguard Worker 
65*795d594fSAndroid Build Coastguard Worker     if (s1 != null && s2 != null && s1.equals(s2)) {
66*795d594fSAndroid Build Coastguard Worker       return;
67*795d594fSAndroid Build Coastguard Worker     }
68*795d594fSAndroid Build Coastguard Worker 
69*795d594fSAndroid Build Coastguard Worker     throw new AssertionError("assertEquals s1: " + s1 + ", s2: " + s2);
70*795d594fSAndroid Build Coastguard Worker   }
71*795d594fSAndroid Build Coastguard Worker 
fail()72*795d594fSAndroid Build Coastguard Worker   public static void fail() {
73*795d594fSAndroid Build Coastguard Worker     System.out.println("fail");
74*795d594fSAndroid Build Coastguard Worker     Thread.dumpStack();
75*795d594fSAndroid Build Coastguard Worker   }
76*795d594fSAndroid Build Coastguard Worker 
fail(String message)77*795d594fSAndroid Build Coastguard Worker   public static void fail(String message) {
78*795d594fSAndroid Build Coastguard Worker     System.out.println("fail: " + message);
79*795d594fSAndroid Build Coastguard Worker     Thread.dumpStack();
80*795d594fSAndroid Build Coastguard Worker   }
81*795d594fSAndroid Build Coastguard Worker 
Min2Print2(int a, int b)82*795d594fSAndroid Build Coastguard Worker   public static int Min2Print2(int a, int b) {
83*795d594fSAndroid Build Coastguard Worker     int[] values = new int[] { a, b };
84*795d594fSAndroid Build Coastguard Worker     System.out.println("Running Main.Min2Print2(" + Arrays.toString(values) + ")");
85*795d594fSAndroid Build Coastguard Worker     return a > b ? a : b;
86*795d594fSAndroid Build Coastguard Worker   }
87*795d594fSAndroid Build Coastguard Worker 
Min2Print3(int a, int b, int c)88*795d594fSAndroid Build Coastguard Worker   public static int Min2Print3(int a, int b, int c) {
89*795d594fSAndroid Build Coastguard Worker     int[] values = new int[] { a, b, c };
90*795d594fSAndroid Build Coastguard Worker     System.out.println("Running Main.Min2Print3(" + Arrays.toString(values) + ")");
91*795d594fSAndroid Build Coastguard Worker     return a > b ? a : b;
92*795d594fSAndroid Build Coastguard Worker   }
93*795d594fSAndroid Build Coastguard Worker 
Min2Print6(int a, int b, int c, int d, int e, int f)94*795d594fSAndroid Build Coastguard Worker   public static int Min2Print6(int a, int b, int c, int d, int e, int f) {
95*795d594fSAndroid Build Coastguard Worker     int[] values = new int[] { a, b, c, d, e, f };
96*795d594fSAndroid Build Coastguard Worker     System.out.println("Running Main.Min2Print6(" + Arrays.toString(values) + ")");
97*795d594fSAndroid Build Coastguard Worker     return a > b ? a : b;
98*795d594fSAndroid Build Coastguard Worker   }
99*795d594fSAndroid Build Coastguard Worker 
Min2Print26(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l, int m, int n, int o, int p, int q, int r, int s, int t, int u, int v, int w, int x, int y, int z)100*795d594fSAndroid Build Coastguard Worker   public static int Min2Print26(int a, int b, int c, int d,
101*795d594fSAndroid Build Coastguard Worker                                 int e, int f, int g, int h,
102*795d594fSAndroid Build Coastguard Worker                                 int i, int j, int k, int l,
103*795d594fSAndroid Build Coastguard Worker                                 int m, int n, int o, int p,
104*795d594fSAndroid Build Coastguard Worker                                 int q, int r, int s, int t,
105*795d594fSAndroid Build Coastguard Worker                                 int u, int v, int w, int x,
106*795d594fSAndroid Build Coastguard Worker                                 int y, int z) {
107*795d594fSAndroid Build Coastguard Worker     int[] values = new int[] { a, b, c, d, e, f, g, h, i, j, k, l, m,
108*795d594fSAndroid Build Coastguard Worker                                n, o, p, q, r, s, t, u, v, w, x, y, z };
109*795d594fSAndroid Build Coastguard Worker     System.out.println("Running Main.Min2Print26(" + Arrays.toString(values) + ")");
110*795d594fSAndroid Build Coastguard Worker     return a > b ? a : b;
111*795d594fSAndroid Build Coastguard Worker   }
112*795d594fSAndroid Build Coastguard Worker 
$opt$BasicTest()113*795d594fSAndroid Build Coastguard Worker   public static void $opt$BasicTest() throws Throwable {
114*795d594fSAndroid Build Coastguard Worker     MethodHandle mh;
115*795d594fSAndroid Build Coastguard Worker     mh = MethodHandles.lookup().findStatic(
116*795d594fSAndroid Build Coastguard Worker         Main.class, "Min2Print2", MethodType.methodType(int.class, int.class, int.class));
117*795d594fSAndroid Build Coastguard Worker     assertEquals((int) mh.invokeExact(33, -4), 33);
118*795d594fSAndroid Build Coastguard Worker     assertEquals((int) mh.invokeExact(-4, 33), 33);
119*795d594fSAndroid Build Coastguard Worker 
120*795d594fSAndroid Build Coastguard Worker     mh = MethodHandles.lookup().findStatic(
121*795d594fSAndroid Build Coastguard Worker         Main.class, "Min2Print3",
122*795d594fSAndroid Build Coastguard Worker         MethodType.methodType(int.class, int.class, int.class, int.class));
123*795d594fSAndroid Build Coastguard Worker     assertEquals((int) mh.invokeExact(33, -4, 17), 33);
124*795d594fSAndroid Build Coastguard Worker     assertEquals((int) mh.invokeExact(-4, 17, 33), 17);
125*795d594fSAndroid Build Coastguard Worker     assertEquals((int) mh.invokeExact(17, 33, -4), 33);
126*795d594fSAndroid Build Coastguard Worker 
127*795d594fSAndroid Build Coastguard Worker     mh = MethodHandles.lookup().findStatic(
128*795d594fSAndroid Build Coastguard Worker         Main.class, "Min2Print6",
129*795d594fSAndroid Build Coastguard Worker         MethodType.methodType(
130*795d594fSAndroid Build Coastguard Worker             int.class, int.class, int.class, int.class, int.class, int.class, int.class));
131*795d594fSAndroid Build Coastguard Worker     assertEquals((int) mh.invokeExact(33, -4, 77, 88, 99, 111), 33);
132*795d594fSAndroid Build Coastguard Worker     try {
133*795d594fSAndroid Build Coastguard Worker         // Too few arguments
134*795d594fSAndroid Build Coastguard Worker         assertEquals((int) mh.invokeExact(33, -4, 77, 88), 33);
135*795d594fSAndroid Build Coastguard Worker         fail("No WMTE for too few arguments");
136*795d594fSAndroid Build Coastguard Worker     } catch (WrongMethodTypeException e) {}
137*795d594fSAndroid Build Coastguard Worker     try {
138*795d594fSAndroid Build Coastguard Worker         // Too many arguments
139*795d594fSAndroid Build Coastguard Worker         assertEquals((int) mh.invokeExact(33, -4, 77, 88, 89, 90, 91), 33);
140*795d594fSAndroid Build Coastguard Worker         fail("No WMTE for too many arguments");
141*795d594fSAndroid Build Coastguard Worker     } catch (WrongMethodTypeException e) {}
142*795d594fSAndroid Build Coastguard Worker     assertEquals((int) mh.invokeExact(-4, 77, 88, 99, 111, 33), 77);
143*795d594fSAndroid Build Coastguard Worker     assertEquals((int) mh.invokeExact(77, 88, 99, 111, 33, -4), 88);
144*795d594fSAndroid Build Coastguard Worker     assertEquals((int) mh.invokeExact(88, 99, 111, 33, -4, 77), 99);
145*795d594fSAndroid Build Coastguard Worker     assertEquals((int) mh.invokeExact(99, 111, 33, -4, 77, 88), 111);
146*795d594fSAndroid Build Coastguard Worker     assertEquals((int) mh.invokeExact(111, 33, -4, 77, 88, 99), 111);
147*795d594fSAndroid Build Coastguard Worker 
148*795d594fSAndroid Build Coastguard Worker     // A preposterous number of arguments.
149*795d594fSAndroid Build Coastguard Worker     mh = MethodHandles.lookup().findStatic(
150*795d594fSAndroid Build Coastguard Worker         Main.class, "Min2Print26",
151*795d594fSAndroid Build Coastguard Worker         MethodType.methodType(
152*795d594fSAndroid Build Coastguard Worker             // Return-type
153*795d594fSAndroid Build Coastguard Worker             int.class,
154*795d594fSAndroid Build Coastguard Worker             // Arguments
155*795d594fSAndroid Build Coastguard Worker             int.class, int.class, int.class, int.class, int.class, int.class, int.class, int.class,
156*795d594fSAndroid Build Coastguard Worker             int.class, int.class, int.class, int.class, int.class, int.class, int.class, int.class,
157*795d594fSAndroid Build Coastguard Worker             int.class, int.class, int.class, int.class, int.class, int.class, int.class, int.class,
158*795d594fSAndroid Build Coastguard Worker             int.class, int.class));
159*795d594fSAndroid Build Coastguard Worker     assertEquals(1, (int) mh.invokeExact(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
160*795d594fSAndroid Build Coastguard Worker                                          13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25));
161*795d594fSAndroid Build Coastguard Worker     assertEquals(25, (int) mh.invokeExact(25, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
162*795d594fSAndroid Build Coastguard Worker                                          13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24));
163*795d594fSAndroid Build Coastguard Worker     assertEquals(25, (int) mh.invokeExact(24, 25, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
164*795d594fSAndroid Build Coastguard Worker                                          13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23));
165*795d594fSAndroid Build Coastguard Worker 
166*795d594fSAndroid Build Coastguard Worker     try {
167*795d594fSAndroid Build Coastguard Worker         // Wrong argument type
168*795d594fSAndroid Build Coastguard Worker         mh.invokeExact("a");
169*795d594fSAndroid Build Coastguard Worker         fail("No WMTE for wrong arguments");
170*795d594fSAndroid Build Coastguard Worker     } catch (WrongMethodTypeException wmte) {}
171*795d594fSAndroid Build Coastguard Worker 
172*795d594fSAndroid Build Coastguard Worker     try {
173*795d594fSAndroid Build Coastguard Worker         // Invoke on null handle.
174*795d594fSAndroid Build Coastguard Worker         MethodHandle mh0 = null;
175*795d594fSAndroid Build Coastguard Worker         mh0.invokeExact("bad");
176*795d594fSAndroid Build Coastguard Worker         fail("No NPE for you");
177*795d594fSAndroid Build Coastguard Worker     } catch (NullPointerException npe) {}
178*795d594fSAndroid Build Coastguard Worker 
179*795d594fSAndroid Build Coastguard Worker     System.out.println("BasicTest done.");
180*795d594fSAndroid Build Coastguard Worker   }
181*795d594fSAndroid Build Coastguard Worker 
And(boolean lhs, boolean rhs)182*795d594fSAndroid Build Coastguard Worker   private static boolean And(boolean lhs, boolean rhs) {
183*795d594fSAndroid Build Coastguard Worker     return lhs & rhs;
184*795d594fSAndroid Build Coastguard Worker   }
185*795d594fSAndroid Build Coastguard Worker 
Xor(boolean lhs, boolean rhs)186*795d594fSAndroid Build Coastguard Worker   private static boolean Xor(boolean lhs, boolean rhs) {
187*795d594fSAndroid Build Coastguard Worker     return lhs ^ rhs;
188*795d594fSAndroid Build Coastguard Worker   }
189*795d594fSAndroid Build Coastguard Worker 
Multiply(String value, int n)190*795d594fSAndroid Build Coastguard Worker   private static String Multiply(String value, int n) {
191*795d594fSAndroid Build Coastguard Worker     String result = "";
192*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; ++i) {
193*795d594fSAndroid Build Coastguard Worker       result = value + result;
194*795d594fSAndroid Build Coastguard Worker     }
195*795d594fSAndroid Build Coastguard Worker     return result;
196*795d594fSAndroid Build Coastguard Worker   }
197*795d594fSAndroid Build Coastguard Worker 
Multiply(byte value, byte n)198*795d594fSAndroid Build Coastguard Worker   private static byte Multiply(byte value, byte n) {
199*795d594fSAndroid Build Coastguard Worker     return (byte)(value * n);
200*795d594fSAndroid Build Coastguard Worker   }
201*795d594fSAndroid Build Coastguard Worker 
Multiply(short value, short n)202*795d594fSAndroid Build Coastguard Worker   private static short Multiply(short value, short n) {
203*795d594fSAndroid Build Coastguard Worker     return (short)(value * n);
204*795d594fSAndroid Build Coastguard Worker   }
205*795d594fSAndroid Build Coastguard Worker 
Multiply(int value, int n)206*795d594fSAndroid Build Coastguard Worker   private static int Multiply(int value, int n) {
207*795d594fSAndroid Build Coastguard Worker     return value * n;
208*795d594fSAndroid Build Coastguard Worker   }
209*795d594fSAndroid Build Coastguard Worker 
Multiply(long value, long n)210*795d594fSAndroid Build Coastguard Worker   private static long Multiply(long value, long n) {
211*795d594fSAndroid Build Coastguard Worker     return value * n;
212*795d594fSAndroid Build Coastguard Worker   }
213*795d594fSAndroid Build Coastguard Worker 
Multiply(float value, float n)214*795d594fSAndroid Build Coastguard Worker   private static float Multiply(float value, float n) {
215*795d594fSAndroid Build Coastguard Worker     return value * n;
216*795d594fSAndroid Build Coastguard Worker   }
217*795d594fSAndroid Build Coastguard Worker 
Multiply(double value, double n)218*795d594fSAndroid Build Coastguard Worker   private static double Multiply(double value, double n) {
219*795d594fSAndroid Build Coastguard Worker     return value * n;
220*795d594fSAndroid Build Coastguard Worker   }
221*795d594fSAndroid Build Coastguard Worker 
Next(char c)222*795d594fSAndroid Build Coastguard Worker   private static char Next(char c) {
223*795d594fSAndroid Build Coastguard Worker     return (char)(c + 1);
224*795d594fSAndroid Build Coastguard Worker   }
225*795d594fSAndroid Build Coastguard Worker 
$opt$ReturnBooleanTest()226*795d594fSAndroid Build Coastguard Worker   public static void $opt$ReturnBooleanTest() throws Throwable {
227*795d594fSAndroid Build Coastguard Worker     MethodHandles.Lookup lookup = MethodHandles.lookup();
228*795d594fSAndroid Build Coastguard Worker     MethodHandle mh =
229*795d594fSAndroid Build Coastguard Worker             lookup.findStatic(Main.class, "And",
230*795d594fSAndroid Build Coastguard Worker                               MethodType.methodType(boolean.class, boolean.class, boolean.class));
231*795d594fSAndroid Build Coastguard Worker     assertEquals(true, (boolean) mh.invokeExact(true, true));
232*795d594fSAndroid Build Coastguard Worker     assertEquals(false, (boolean) mh.invokeExact(true, false));
233*795d594fSAndroid Build Coastguard Worker     assertEquals(false, (boolean) mh.invokeExact(false, true));
234*795d594fSAndroid Build Coastguard Worker     assertEquals(false, (boolean) mh.invokeExact(false, false));
235*795d594fSAndroid Build Coastguard Worker     assertEquals(true, (boolean) mh.invoke(true, true));
236*795d594fSAndroid Build Coastguard Worker     assertEquals(false, (boolean) mh.invoke(true, false));
237*795d594fSAndroid Build Coastguard Worker     assertEquals(false, (boolean) mh.invoke(false, true));
238*795d594fSAndroid Build Coastguard Worker     assertEquals(false, (boolean) mh.invoke(false, false));
239*795d594fSAndroid Build Coastguard Worker 
240*795d594fSAndroid Build Coastguard Worker     mh = lookup.findStatic(Main.class, "Xor",
241*795d594fSAndroid Build Coastguard Worker                            MethodType.methodType(boolean.class, boolean.class, boolean.class));
242*795d594fSAndroid Build Coastguard Worker     assertEquals(false, (boolean) mh.invokeExact(true, true));
243*795d594fSAndroid Build Coastguard Worker     assertEquals(true, (boolean) mh.invokeExact(true, false));
244*795d594fSAndroid Build Coastguard Worker     assertEquals(true, (boolean) mh.invokeExact(false, true));
245*795d594fSAndroid Build Coastguard Worker     assertEquals(false, (boolean) mh.invokeExact(false, false));
246*795d594fSAndroid Build Coastguard Worker     assertEquals(false, (boolean) mh.invoke(true, true));
247*795d594fSAndroid Build Coastguard Worker     assertEquals(true, (boolean) mh.invoke(true, false));
248*795d594fSAndroid Build Coastguard Worker     assertEquals(true, (boolean) mh.invoke(false, true));
249*795d594fSAndroid Build Coastguard Worker     assertEquals(false, (boolean) mh.invoke(false, false));
250*795d594fSAndroid Build Coastguard Worker 
251*795d594fSAndroid Build Coastguard Worker     System.out.println("$opt$ReturnBooleanTest done.");
252*795d594fSAndroid Build Coastguard Worker   }
253*795d594fSAndroid Build Coastguard Worker 
$opt$ReturnCharTest()254*795d594fSAndroid Build Coastguard Worker   public static void $opt$ReturnCharTest() throws Throwable {
255*795d594fSAndroid Build Coastguard Worker     MethodHandles.Lookup lookup = MethodHandles.lookup();
256*795d594fSAndroid Build Coastguard Worker     MethodHandle mh = lookup.findStatic(Main.class, "Next",
257*795d594fSAndroid Build Coastguard Worker                            MethodType.methodType(char.class, char.class));
258*795d594fSAndroid Build Coastguard Worker     assertEquals('B', (char) mh.invokeExact('A'));
259*795d594fSAndroid Build Coastguard Worker     assertEquals((char) -55, (char) mh.invokeExact((char) -56));
260*795d594fSAndroid Build Coastguard Worker     System.out.println("$opt$ReturnCharTest done.");
261*795d594fSAndroid Build Coastguard Worker   }
262*795d594fSAndroid Build Coastguard Worker 
$opt$ReturnByteTest()263*795d594fSAndroid Build Coastguard Worker   public static void $opt$ReturnByteTest() throws Throwable {
264*795d594fSAndroid Build Coastguard Worker     MethodHandles.Lookup lookup = MethodHandles.lookup();
265*795d594fSAndroid Build Coastguard Worker     MethodHandle mh = lookup.findStatic(Main.class, "Multiply",
266*795d594fSAndroid Build Coastguard Worker                                          MethodType.methodType(byte.class, byte.class, byte.class));
267*795d594fSAndroid Build Coastguard Worker     assertEquals((byte) 30, (byte) mh.invokeExact((byte) 10, (byte) 3));
268*795d594fSAndroid Build Coastguard Worker     assertEquals((byte) -90, (byte) mh.invoke((byte) -10, (byte) 9));
269*795d594fSAndroid Build Coastguard Worker     System.out.println("$opt$ReturnByteTest done.");
270*795d594fSAndroid Build Coastguard Worker   }
271*795d594fSAndroid Build Coastguard Worker 
$opt$ReturnShortTest()272*795d594fSAndroid Build Coastguard Worker   public static void $opt$ReturnShortTest() throws Throwable {
273*795d594fSAndroid Build Coastguard Worker     MethodHandles.Lookup lookup = MethodHandles.lookup();
274*795d594fSAndroid Build Coastguard Worker     MethodHandle mh = lookup.findStatic(Main.class, "Multiply",
275*795d594fSAndroid Build Coastguard Worker                            MethodType.methodType(short.class, short.class, short.class));
276*795d594fSAndroid Build Coastguard Worker     assertEquals((short) 3000, (short) mh.invokeExact((short) 1000, (short) 3));
277*795d594fSAndroid Build Coastguard Worker     assertEquals((short) -3000, (short) mh.invoke((short) -1000, (short) 3));
278*795d594fSAndroid Build Coastguard Worker     System.out.println("$opt$ReturnShortTest done.");
279*795d594fSAndroid Build Coastguard Worker   }
280*795d594fSAndroid Build Coastguard Worker 
$opt$ReturnIntTest()281*795d594fSAndroid Build Coastguard Worker   public static void $opt$ReturnIntTest() throws Throwable {
282*795d594fSAndroid Build Coastguard Worker     MethodHandles.Lookup lookup = MethodHandles.lookup();
283*795d594fSAndroid Build Coastguard Worker     MethodHandle mh = lookup.findStatic(Main.class, "Multiply",
284*795d594fSAndroid Build Coastguard Worker                            MethodType.methodType(int.class, int.class, int.class));
285*795d594fSAndroid Build Coastguard Worker     assertEquals(3_000_000, (int) mh.invokeExact(1_000_000, 3));
286*795d594fSAndroid Build Coastguard Worker     assertEquals(-3_000_000, (int) mh.invoke(-1_000, 3_000));
287*795d594fSAndroid Build Coastguard Worker     System.out.println("$opt$ReturnIntTest done.");
288*795d594fSAndroid Build Coastguard Worker   }
289*795d594fSAndroid Build Coastguard Worker 
$opt$ReturnLongTest()290*795d594fSAndroid Build Coastguard Worker   public static void $opt$ReturnLongTest() throws Throwable {
291*795d594fSAndroid Build Coastguard Worker     MethodHandles.Lookup lookup = MethodHandles.lookup();
292*795d594fSAndroid Build Coastguard Worker     MethodHandle mh = lookup.findStatic(Main.class, "Multiply",
293*795d594fSAndroid Build Coastguard Worker                            MethodType.methodType(long.class, long.class, long.class));
294*795d594fSAndroid Build Coastguard Worker     assertEquals(4_294_967_295_000L, (long) mh.invokeExact(1000L, 4_294_967_295L));
295*795d594fSAndroid Build Coastguard Worker     assertEquals(-4_294_967_295_000L, (long) mh.invoke(-1000L, 4_294_967_295L));
296*795d594fSAndroid Build Coastguard Worker     System.out.println("$opt$ReturnLongTest done.");
297*795d594fSAndroid Build Coastguard Worker   }
298*795d594fSAndroid Build Coastguard Worker 
$opt$ReturnFloatTest()299*795d594fSAndroid Build Coastguard Worker   public static void $opt$ReturnFloatTest() throws Throwable {
300*795d594fSAndroid Build Coastguard Worker     MethodHandles.Lookup lookup = MethodHandles.lookup();
301*795d594fSAndroid Build Coastguard Worker     MethodHandle mh = lookup.findStatic(Main.class, "Multiply",
302*795d594fSAndroid Build Coastguard Worker                            MethodType.methodType(float.class, float.class, float.class));
303*795d594fSAndroid Build Coastguard Worker     assertEquals(3.0F, (float) mh.invokeExact(1000.0F, 3e-3F));
304*795d594fSAndroid Build Coastguard Worker     assertEquals(-3.0F, (float) mh.invoke(-1000.0F, 3e-3F));
305*795d594fSAndroid Build Coastguard Worker     System.out.println("$opt$ReturnFloatTest done.");
306*795d594fSAndroid Build Coastguard Worker   }
307*795d594fSAndroid Build Coastguard Worker 
$opt$ReturnDoubleTest()308*795d594fSAndroid Build Coastguard Worker   public static void $opt$ReturnDoubleTest() throws Throwable {
309*795d594fSAndroid Build Coastguard Worker     MethodHandles.Lookup lookup = MethodHandles.lookup();
310*795d594fSAndroid Build Coastguard Worker     MethodHandle mh = lookup.findStatic(Main.class, "Multiply",
311*795d594fSAndroid Build Coastguard Worker                            MethodType.methodType(double.class, double.class, double.class));
312*795d594fSAndroid Build Coastguard Worker     assertEquals(3033000.0, (double) mh.invokeExact(1000.0, 3.033e3));
313*795d594fSAndroid Build Coastguard Worker     assertEquals(-3033000.0, (double) mh.invoke(-1000.0, 3.033e3));
314*795d594fSAndroid Build Coastguard Worker     System.out.println("$opt$ReturnDoubleTest done.");
315*795d594fSAndroid Build Coastguard Worker   }
316*795d594fSAndroid Build Coastguard Worker 
$opt$ReturnStringTest()317*795d594fSAndroid Build Coastguard Worker   public static void $opt$ReturnStringTest() throws Throwable {
318*795d594fSAndroid Build Coastguard Worker     MethodHandles.Lookup lookup = MethodHandles.lookup();
319*795d594fSAndroid Build Coastguard Worker     MethodHandle mh = lookup.findStatic(Main.class, "Multiply",
320*795d594fSAndroid Build Coastguard Worker                            MethodType.methodType(String.class, String.class, int.class));
321*795d594fSAndroid Build Coastguard Worker     assertEquals("100010001000", (String) mh.invokeExact("1000", 3));
322*795d594fSAndroid Build Coastguard Worker     assertEquals("100010001000", (String) mh.invoke("1000", 3));
323*795d594fSAndroid Build Coastguard Worker     System.out.println("$opt$ReturnStringTest done.");
324*795d594fSAndroid Build Coastguard Worker   }
325*795d594fSAndroid Build Coastguard Worker 
ReturnValuesTest()326*795d594fSAndroid Build Coastguard Worker   public static void ReturnValuesTest() throws Throwable {
327*795d594fSAndroid Build Coastguard Worker     $opt$ReturnBooleanTest();
328*795d594fSAndroid Build Coastguard Worker     $opt$ReturnCharTest();
329*795d594fSAndroid Build Coastguard Worker     $opt$ReturnByteTest();
330*795d594fSAndroid Build Coastguard Worker     $opt$ReturnShortTest();
331*795d594fSAndroid Build Coastguard Worker     $opt$ReturnIntTest();
332*795d594fSAndroid Build Coastguard Worker     $opt$ReturnLongTest();
333*795d594fSAndroid Build Coastguard Worker     $opt$ReturnFloatTest();
334*795d594fSAndroid Build Coastguard Worker     $opt$ReturnDoubleTest();
335*795d594fSAndroid Build Coastguard Worker     $opt$ReturnStringTest();
336*795d594fSAndroid Build Coastguard Worker     System.out.println("ReturnValuesTest done.");
337*795d594fSAndroid Build Coastguard Worker   }
338*795d594fSAndroid Build Coastguard Worker 
339*795d594fSAndroid Build Coastguard Worker   static class ValueHolder {
340*795d594fSAndroid Build Coastguard Worker     public boolean m_z;
341*795d594fSAndroid Build Coastguard Worker     public static boolean s_z;
342*795d594fSAndroid Build Coastguard Worker   }
343*795d594fSAndroid Build Coastguard Worker 
$opt$AccessorsTest()344*795d594fSAndroid Build Coastguard Worker   public static void $opt$AccessorsTest() throws Throwable {
345*795d594fSAndroid Build Coastguard Worker     ValueHolder valueHolder = new ValueHolder();
346*795d594fSAndroid Build Coastguard Worker     MethodHandles.Lookup lookup = MethodHandles.lookup();
347*795d594fSAndroid Build Coastguard Worker 
348*795d594fSAndroid Build Coastguard Worker     MethodHandle setMember = lookup.findSetter(ValueHolder.class, "m_z", boolean.class);
349*795d594fSAndroid Build Coastguard Worker     MethodHandle getMember = lookup.findGetter(ValueHolder.class, "m_z", boolean.class);
350*795d594fSAndroid Build Coastguard Worker     MethodHandle setStatic = lookup.findStaticSetter(ValueHolder.class, "s_z", boolean.class);
351*795d594fSAndroid Build Coastguard Worker     MethodHandle getStatic = lookup.findStaticGetter(ValueHolder.class, "s_z", boolean.class);
352*795d594fSAndroid Build Coastguard Worker 
353*795d594fSAndroid Build Coastguard Worker     boolean [] values = { false, true, false, true, false };
354*795d594fSAndroid Build Coastguard Worker     for (boolean value : values) {
355*795d594fSAndroid Build Coastguard Worker       assertEquals((boolean) getStatic.invoke(), ValueHolder.s_z);
356*795d594fSAndroid Build Coastguard Worker       setStatic.invoke(value);
357*795d594fSAndroid Build Coastguard Worker       ValueHolder.s_z = value;
358*795d594fSAndroid Build Coastguard Worker       assertEquals(ValueHolder.s_z, value);
359*795d594fSAndroid Build Coastguard Worker       assertEquals((boolean) getStatic.invoke(), value);
360*795d594fSAndroid Build Coastguard Worker 
361*795d594fSAndroid Build Coastguard Worker       assertEquals((boolean) getMember.invoke(valueHolder), valueHolder.m_z);
362*795d594fSAndroid Build Coastguard Worker       setMember.invoke(valueHolder, value);
363*795d594fSAndroid Build Coastguard Worker       valueHolder.m_z = value;
364*795d594fSAndroid Build Coastguard Worker       assertEquals(valueHolder.m_z, value);
365*795d594fSAndroid Build Coastguard Worker       assertEquals((boolean) getMember.invoke(valueHolder), value);
366*795d594fSAndroid Build Coastguard Worker     }
367*795d594fSAndroid Build Coastguard Worker   }
368*795d594fSAndroid Build Coastguard Worker 
main(String[] args)369*795d594fSAndroid Build Coastguard Worker   public static void main(String[] args) throws Throwable {
370*795d594fSAndroid Build Coastguard Worker     $opt$BasicTest();
371*795d594fSAndroid Build Coastguard Worker     ReturnValuesTest();
372*795d594fSAndroid Build Coastguard Worker     $opt$AccessorsTest();
373*795d594fSAndroid Build Coastguard Worker   }
374*795d594fSAndroid Build Coastguard Worker }
375