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