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