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