1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2018 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 annotations.BootstrapMethod; 18*795d594fSAndroid Build Coastguard Worker import annotations.CalledByIndy; 19*795d594fSAndroid Build Coastguard Worker import annotations.Constant; 20*795d594fSAndroid Build Coastguard Worker import java.lang.invoke.CallSite; 21*795d594fSAndroid Build Coastguard Worker import java.lang.invoke.ConstantCallSite; 22*795d594fSAndroid Build Coastguard Worker import java.lang.invoke.MethodHandle; 23*795d594fSAndroid Build Coastguard Worker import java.lang.invoke.MethodHandles; 24*795d594fSAndroid Build Coastguard Worker import java.lang.invoke.MethodType; 25*795d594fSAndroid Build Coastguard Worker 26*795d594fSAndroid Build Coastguard Worker class TestDynamicBootstrapArguments extends TestBase { 27*795d594fSAndroid Build Coastguard Worker private static int bsmCalls = 0; 28*795d594fSAndroid Build Coastguard Worker bsm( MethodHandles.Lookup lookup, String name, MethodType methodType, String otherNameComponent, long nameSuffix)29*795d594fSAndroid Build Coastguard Worker static CallSite bsm( 30*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup lookup, 31*795d594fSAndroid Build Coastguard Worker String name, 32*795d594fSAndroid Build Coastguard Worker MethodType methodType, 33*795d594fSAndroid Build Coastguard Worker String otherNameComponent, 34*795d594fSAndroid Build Coastguard Worker long nameSuffix) 35*795d594fSAndroid Build Coastguard Worker throws Throwable { 36*795d594fSAndroid Build Coastguard Worker bsmCalls = bsmCalls + 1; 37*795d594fSAndroid Build Coastguard Worker Class<?> definingClass = TestDynamicBootstrapArguments.class; 38*795d594fSAndroid Build Coastguard Worker String methodName = name + otherNameComponent + nameSuffix; 39*795d594fSAndroid Build Coastguard Worker MethodHandle mh = lookup.findStatic(definingClass, methodName, methodType); 40*795d594fSAndroid Build Coastguard Worker System.out.println("bsm"); 41*795d594fSAndroid Build Coastguard Worker return new ConstantCallSite(mh); 42*795d594fSAndroid Build Coastguard Worker } 43*795d594fSAndroid Build Coastguard Worker 44*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 45*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 46*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 47*795d594fSAndroid Build Coastguard Worker enclosingType = TestDynamicBootstrapArguments.class, 48*795d594fSAndroid Build Coastguard Worker name = "bsm", 49*795d594fSAndroid Build Coastguard Worker parameterTypes = { 50*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 51*795d594fSAndroid Build Coastguard Worker String.class, 52*795d594fSAndroid Build Coastguard Worker MethodType.class, 53*795d594fSAndroid Build Coastguard Worker String.class, 54*795d594fSAndroid Build Coastguard Worker long.class 55*795d594fSAndroid Build Coastguard Worker } 56*795d594fSAndroid Build Coastguard Worker ), 57*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "target", 58*795d594fSAndroid Build Coastguard Worker returnType = int.class, 59*795d594fSAndroid Build Coastguard Worker parameterTypes = {int.class, String.class, double.class}, 60*795d594fSAndroid Build Coastguard Worker constantArgumentsForBootstrapMethod = { 61*795d594fSAndroid Build Coastguard Worker @Constant(stringValue = "A"), 62*795d594fSAndroid Build Coastguard Worker @Constant(longValue = 100000000l) 63*795d594fSAndroid Build Coastguard Worker } 64*795d594fSAndroid Build Coastguard Worker ) testDynamic(int i, String s, Double d)65*795d594fSAndroid Build Coastguard Worker private static int testDynamic(int i, String s, Double d) { 66*795d594fSAndroid Build Coastguard Worker assertNotReached(); 67*795d594fSAndroid Build Coastguard Worker return 0; 68*795d594fSAndroid Build Coastguard Worker } 69*795d594fSAndroid Build Coastguard Worker targetA100000000(int i, String s, Double d)70*795d594fSAndroid Build Coastguard Worker private static int targetA100000000(int i, String s, Double d) { 71*795d594fSAndroid Build Coastguard Worker System.out.print(i); 72*795d594fSAndroid Build Coastguard Worker System.out.print(", "); 73*795d594fSAndroid Build Coastguard Worker System.out.print(s); 74*795d594fSAndroid Build Coastguard Worker System.out.print(", "); 75*795d594fSAndroid Build Coastguard Worker System.out.println(d); 76*795d594fSAndroid Build Coastguard Worker return i; 77*795d594fSAndroid Build Coastguard Worker } 78*795d594fSAndroid Build Coastguard Worker testCallSites()79*795d594fSAndroid Build Coastguard Worker static void testCallSites() { 80*795d594fSAndroid Build Coastguard Worker assertEquals(0, testDynamic(0, "One", Math.PI)); 81*795d594fSAndroid Build Coastguard Worker assertEquals(1, testDynamic(1, "Two", Math.E)); 82*795d594fSAndroid Build Coastguard Worker assertEquals(2, testDynamic(2, "Three", 0.0)); 83*795d594fSAndroid Build Coastguard Worker } 84*795d594fSAndroid Build Coastguard Worker test()85*795d594fSAndroid Build Coastguard Worker static void test() { 86*795d594fSAndroid Build Coastguard Worker System.out.println("TestDynamicArguments"); 87*795d594fSAndroid Build Coastguard Worker testCallSites(); 88*795d594fSAndroid Build Coastguard Worker assertEquals(3, bsmCalls); 89*795d594fSAndroid Build Coastguard Worker testCallSites(); 90*795d594fSAndroid Build Coastguard Worker assertEquals(3, bsmCalls); 91*795d594fSAndroid Build Coastguard Worker } 92*795d594fSAndroid Build Coastguard Worker } 93