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 import java.util.Arrays; 26*795d594fSAndroid Build Coastguard Worker 27*795d594fSAndroid Build Coastguard Worker public class TestVariableArityLinkerMethod extends TestBase { printBsmArgs(String method, Object... args)28*795d594fSAndroid Build Coastguard Worker private static void printBsmArgs(String method, Object... args) { 29*795d594fSAndroid Build Coastguard Worker System.out.print(method); 30*795d594fSAndroid Build Coastguard Worker System.out.print("("); 31*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < args.length; ++i) { 32*795d594fSAndroid Build Coastguard Worker if (i != 0) { 33*795d594fSAndroid Build Coastguard Worker System.out.print(", "); 34*795d594fSAndroid Build Coastguard Worker } 35*795d594fSAndroid Build Coastguard Worker if (args[i] != null && args[i].getClass().isArray()) { 36*795d594fSAndroid Build Coastguard Worker Object array = args[i]; 37*795d594fSAndroid Build Coastguard Worker if (array.getClass() == int[].class) { 38*795d594fSAndroid Build Coastguard Worker System.out.print(Arrays.toString((int[]) array)); 39*795d594fSAndroid Build Coastguard Worker } else if (array.getClass() == long[].class) { 40*795d594fSAndroid Build Coastguard Worker System.out.print(Arrays.toString((long[]) array)); 41*795d594fSAndroid Build Coastguard Worker } else if (array.getClass() == float[].class) { 42*795d594fSAndroid Build Coastguard Worker System.out.print(Arrays.toString((float[]) array)); 43*795d594fSAndroid Build Coastguard Worker } else if (array.getClass() == double[].class) { 44*795d594fSAndroid Build Coastguard Worker System.out.print(Arrays.toString((double[]) array)); 45*795d594fSAndroid Build Coastguard Worker } else { 46*795d594fSAndroid Build Coastguard Worker System.out.print(Arrays.toString((Object[]) array)); 47*795d594fSAndroid Build Coastguard Worker } 48*795d594fSAndroid Build Coastguard Worker } else { 49*795d594fSAndroid Build Coastguard Worker System.out.print(args[i]); 50*795d594fSAndroid Build Coastguard Worker } 51*795d594fSAndroid Build Coastguard Worker } 52*795d594fSAndroid Build Coastguard Worker System.out.println(");"); 53*795d594fSAndroid Build Coastguard Worker } 54*795d594fSAndroid Build Coastguard Worker bsmWithStringArray( MethodHandles.Lookup lookup, String methodName, MethodType methodType, String... arityArgs)55*795d594fSAndroid Build Coastguard Worker private static CallSite bsmWithStringArray( 56*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup lookup, 57*795d594fSAndroid Build Coastguard Worker String methodName, 58*795d594fSAndroid Build Coastguard Worker MethodType methodType, 59*795d594fSAndroid Build Coastguard Worker String... arityArgs) 60*795d594fSAndroid Build Coastguard Worker throws Throwable { 61*795d594fSAndroid Build Coastguard Worker printBsmArgs("bsmWithStringArray", lookup, methodName, methodType, arityArgs); 62*795d594fSAndroid Build Coastguard Worker MethodHandle mh = lookup.findStatic(lookup.lookupClass(), methodName, methodType); 63*795d594fSAndroid Build Coastguard Worker return new ConstantCallSite(mh); 64*795d594fSAndroid Build Coastguard Worker } 65*795d594fSAndroid Build Coastguard Worker 66*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 67*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 68*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 69*795d594fSAndroid Build Coastguard Worker enclosingType = TestVariableArityLinkerMethod.class, 70*795d594fSAndroid Build Coastguard Worker name = "bsmWithStringArray", 71*795d594fSAndroid Build Coastguard Worker parameterTypes = { 72*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 73*795d594fSAndroid Build Coastguard Worker String.class, 74*795d594fSAndroid Build Coastguard Worker MethodType.class, 75*795d594fSAndroid Build Coastguard Worker String[].class 76*795d594fSAndroid Build Coastguard Worker } 77*795d594fSAndroid Build Coastguard Worker ), 78*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "methodA", 79*795d594fSAndroid Build Coastguard Worker constantArgumentsForBootstrapMethod = { 80*795d594fSAndroid Build Coastguard Worker @Constant(stringValue = "Aachen"), 81*795d594fSAndroid Build Coastguard Worker @Constant(stringValue = "Aalborg"), 82*795d594fSAndroid Build Coastguard Worker @Constant(stringValue = "Aalto") 83*795d594fSAndroid Build Coastguard Worker } 84*795d594fSAndroid Build Coastguard Worker ) methodA()85*795d594fSAndroid Build Coastguard Worker private static void methodA() { 86*795d594fSAndroid Build Coastguard Worker System.out.println("methodA"); 87*795d594fSAndroid Build Coastguard Worker } 88*795d594fSAndroid Build Coastguard Worker 89*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 90*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 91*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 92*795d594fSAndroid Build Coastguard Worker enclosingType = TestVariableArityLinkerMethod.class, 93*795d594fSAndroid Build Coastguard Worker name = "bsmWithStringArray", 94*795d594fSAndroid Build Coastguard Worker parameterTypes = { 95*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 96*795d594fSAndroid Build Coastguard Worker String.class, 97*795d594fSAndroid Build Coastguard Worker MethodType.class, 98*795d594fSAndroid Build Coastguard Worker String[].class 99*795d594fSAndroid Build Coastguard Worker } 100*795d594fSAndroid Build Coastguard Worker ), 101*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "methodB", 102*795d594fSAndroid Build Coastguard Worker constantArgumentsForBootstrapMethod = {@Constant(stringValue = "barium")} 103*795d594fSAndroid Build Coastguard Worker ) methodB()104*795d594fSAndroid Build Coastguard Worker private static void methodB() { 105*795d594fSAndroid Build Coastguard Worker System.out.println("methodB"); 106*795d594fSAndroid Build Coastguard Worker } 107*795d594fSAndroid Build Coastguard Worker 108*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 109*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 110*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 111*795d594fSAndroid Build Coastguard Worker enclosingType = TestVariableArityLinkerMethod.class, 112*795d594fSAndroid Build Coastguard Worker name = "bsmWithStringArray", 113*795d594fSAndroid Build Coastguard Worker parameterTypes = { 114*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 115*795d594fSAndroid Build Coastguard Worker String.class, 116*795d594fSAndroid Build Coastguard Worker MethodType.class, 117*795d594fSAndroid Build Coastguard Worker String[].class 118*795d594fSAndroid Build Coastguard Worker } 119*795d594fSAndroid Build Coastguard Worker ), 120*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "methodC" 121*795d594fSAndroid Build Coastguard Worker ) methodC()122*795d594fSAndroid Build Coastguard Worker private static void methodC() { 123*795d594fSAndroid Build Coastguard Worker System.out.println("methodC"); 124*795d594fSAndroid Build Coastguard Worker } 125*795d594fSAndroid Build Coastguard Worker bsmWithIntAndStringArray( MethodHandles.Lookup lookup, String methodName, MethodType methodType, int extraInt, String... extraArityArgs)126*795d594fSAndroid Build Coastguard Worker private static CallSite bsmWithIntAndStringArray( 127*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup lookup, 128*795d594fSAndroid Build Coastguard Worker String methodName, 129*795d594fSAndroid Build Coastguard Worker MethodType methodType, 130*795d594fSAndroid Build Coastguard Worker int extraInt, 131*795d594fSAndroid Build Coastguard Worker String... extraArityArgs) 132*795d594fSAndroid Build Coastguard Worker throws Throwable { 133*795d594fSAndroid Build Coastguard Worker printBsmArgs( 134*795d594fSAndroid Build Coastguard Worker "bsmWithIntAndStringArray", 135*795d594fSAndroid Build Coastguard Worker lookup, 136*795d594fSAndroid Build Coastguard Worker methodName, 137*795d594fSAndroid Build Coastguard Worker methodType, 138*795d594fSAndroid Build Coastguard Worker extraInt, 139*795d594fSAndroid Build Coastguard Worker extraArityArgs); 140*795d594fSAndroid Build Coastguard Worker MethodHandle mh = lookup.findStatic(lookup.lookupClass(), methodName, methodType); 141*795d594fSAndroid Build Coastguard Worker return new ConstantCallSite(mh); 142*795d594fSAndroid Build Coastguard Worker } 143*795d594fSAndroid Build Coastguard Worker 144*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 145*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 146*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 147*795d594fSAndroid Build Coastguard Worker enclosingType = TestVariableArityLinkerMethod.class, 148*795d594fSAndroid Build Coastguard Worker name = "bsmWithIntAndStringArray", 149*795d594fSAndroid Build Coastguard Worker parameterTypes = { 150*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 151*795d594fSAndroid Build Coastguard Worker String.class, 152*795d594fSAndroid Build Coastguard Worker MethodType.class, 153*795d594fSAndroid Build Coastguard Worker int.class, 154*795d594fSAndroid Build Coastguard Worker String[].class 155*795d594fSAndroid Build Coastguard Worker } 156*795d594fSAndroid Build Coastguard Worker ), 157*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "methodD", 158*795d594fSAndroid Build Coastguard Worker constantArgumentsForBootstrapMethod = { 159*795d594fSAndroid Build Coastguard Worker @Constant(intValue = 101), 160*795d594fSAndroid Build Coastguard Worker @Constant(stringValue = "zoo"), 161*795d594fSAndroid Build Coastguard Worker @Constant(stringValue = "zoogene"), 162*795d594fSAndroid Build Coastguard Worker @Constant(stringValue = "zoogenic") 163*795d594fSAndroid Build Coastguard Worker } 164*795d594fSAndroid Build Coastguard Worker ) methodD()165*795d594fSAndroid Build Coastguard Worker private static void methodD() { 166*795d594fSAndroid Build Coastguard Worker System.out.println("methodD"); 167*795d594fSAndroid Build Coastguard Worker } 168*795d594fSAndroid Build Coastguard Worker 169*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 170*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 171*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 172*795d594fSAndroid Build Coastguard Worker enclosingType = TestVariableArityLinkerMethod.class, 173*795d594fSAndroid Build Coastguard Worker name = "bsmWithIntAndStringArray", 174*795d594fSAndroid Build Coastguard Worker parameterTypes = { 175*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 176*795d594fSAndroid Build Coastguard Worker String.class, 177*795d594fSAndroid Build Coastguard Worker MethodType.class, 178*795d594fSAndroid Build Coastguard Worker int.class, 179*795d594fSAndroid Build Coastguard Worker String[].class 180*795d594fSAndroid Build Coastguard Worker } 181*795d594fSAndroid Build Coastguard Worker ), 182*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "methodE", 183*795d594fSAndroid Build Coastguard Worker constantArgumentsForBootstrapMethod = { 184*795d594fSAndroid Build Coastguard Worker @Constant(intValue = 102), 185*795d594fSAndroid Build Coastguard Worker @Constant(stringValue = "zonic") 186*795d594fSAndroid Build Coastguard Worker } 187*795d594fSAndroid Build Coastguard Worker ) methodE()188*795d594fSAndroid Build Coastguard Worker private static void methodE() { 189*795d594fSAndroid Build Coastguard Worker System.out.println("methodE"); 190*795d594fSAndroid Build Coastguard Worker } 191*795d594fSAndroid Build Coastguard Worker 192*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 193*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 194*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 195*795d594fSAndroid Build Coastguard Worker enclosingType = TestVariableArityLinkerMethod.class, 196*795d594fSAndroid Build Coastguard Worker name = "bsmWithIntAndStringArray", 197*795d594fSAndroid Build Coastguard Worker parameterTypes = { 198*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 199*795d594fSAndroid Build Coastguard Worker String.class, 200*795d594fSAndroid Build Coastguard Worker MethodType.class, 201*795d594fSAndroid Build Coastguard Worker int.class, 202*795d594fSAndroid Build Coastguard Worker String[].class 203*795d594fSAndroid Build Coastguard Worker } 204*795d594fSAndroid Build Coastguard Worker ), 205*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "methodF", 206*795d594fSAndroid Build Coastguard Worker constantArgumentsForBootstrapMethod = {@Constant(intValue = 103)} 207*795d594fSAndroid Build Coastguard Worker ) methodF()208*795d594fSAndroid Build Coastguard Worker private static void methodF() { 209*795d594fSAndroid Build Coastguard Worker System.out.println("methodF"); 210*795d594fSAndroid Build Coastguard Worker } 211*795d594fSAndroid Build Coastguard Worker bsmWithLongAndIntArray( MethodHandles.Lookup lookup, String methodName, MethodType methodType, long extraArg, int... arityArgs)212*795d594fSAndroid Build Coastguard Worker private static CallSite bsmWithLongAndIntArray( 213*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup lookup, 214*795d594fSAndroid Build Coastguard Worker String methodName, 215*795d594fSAndroid Build Coastguard Worker MethodType methodType, 216*795d594fSAndroid Build Coastguard Worker long extraArg, 217*795d594fSAndroid Build Coastguard Worker int... arityArgs) 218*795d594fSAndroid Build Coastguard Worker throws Throwable { 219*795d594fSAndroid Build Coastguard Worker printBsmArgs("bsmWithLongAndIntArray", lookup, methodName, methodType, extraArg, arityArgs); 220*795d594fSAndroid Build Coastguard Worker MethodHandle mh = lookup.findStatic(lookup.lookupClass(), methodName, methodType); 221*795d594fSAndroid Build Coastguard Worker return new ConstantCallSite(mh); 222*795d594fSAndroid Build Coastguard Worker } 223*795d594fSAndroid Build Coastguard Worker 224*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 225*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 226*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 227*795d594fSAndroid Build Coastguard Worker enclosingType = TestVariableArityLinkerMethod.class, 228*795d594fSAndroid Build Coastguard Worker name = "bsmWithLongAndIntArray", 229*795d594fSAndroid Build Coastguard Worker parameterTypes = { 230*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 231*795d594fSAndroid Build Coastguard Worker String.class, 232*795d594fSAndroid Build Coastguard Worker MethodType.class, 233*795d594fSAndroid Build Coastguard Worker long.class, 234*795d594fSAndroid Build Coastguard Worker int[].class 235*795d594fSAndroid Build Coastguard Worker } 236*795d594fSAndroid Build Coastguard Worker ), 237*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "methodG", 238*795d594fSAndroid Build Coastguard Worker constantArgumentsForBootstrapMethod = { 239*795d594fSAndroid Build Coastguard Worker @Constant(longValue = 0x123456789abcdefl), 240*795d594fSAndroid Build Coastguard Worker @Constant(intValue = +1), 241*795d594fSAndroid Build Coastguard Worker @Constant(intValue = -1), 242*795d594fSAndroid Build Coastguard Worker @Constant(intValue = +2), 243*795d594fSAndroid Build Coastguard Worker @Constant(intValue = -2) 244*795d594fSAndroid Build Coastguard Worker } 245*795d594fSAndroid Build Coastguard Worker ) methodG()246*795d594fSAndroid Build Coastguard Worker private static void methodG() { 247*795d594fSAndroid Build Coastguard Worker System.out.println("methodG"); 248*795d594fSAndroid Build Coastguard Worker } 249*795d594fSAndroid Build Coastguard Worker bsmWithFloatAndLongArray( MethodHandles.Lookup lookup, String methodName, MethodType methodType, float extraArg, long... arityArgs)250*795d594fSAndroid Build Coastguard Worker private static CallSite bsmWithFloatAndLongArray( 251*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup lookup, 252*795d594fSAndroid Build Coastguard Worker String methodName, 253*795d594fSAndroid Build Coastguard Worker MethodType methodType, 254*795d594fSAndroid Build Coastguard Worker float extraArg, 255*795d594fSAndroid Build Coastguard Worker long... arityArgs) 256*795d594fSAndroid Build Coastguard Worker throws Throwable { 257*795d594fSAndroid Build Coastguard Worker printBsmArgs( 258*795d594fSAndroid Build Coastguard Worker "bsmWithFloatAndLongArray", lookup, methodName, methodType, extraArg, arityArgs); 259*795d594fSAndroid Build Coastguard Worker MethodHandle mh = lookup.findStatic(lookup.lookupClass(), methodName, methodType); 260*795d594fSAndroid Build Coastguard Worker return new ConstantCallSite(mh); 261*795d594fSAndroid Build Coastguard Worker } 262*795d594fSAndroid Build Coastguard Worker 263*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 264*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 265*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 266*795d594fSAndroid Build Coastguard Worker enclosingType = TestVariableArityLinkerMethod.class, 267*795d594fSAndroid Build Coastguard Worker name = "bsmWithFloatAndLongArray", 268*795d594fSAndroid Build Coastguard Worker parameterTypes = { 269*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 270*795d594fSAndroid Build Coastguard Worker String.class, 271*795d594fSAndroid Build Coastguard Worker MethodType.class, 272*795d594fSAndroid Build Coastguard Worker float.class, 273*795d594fSAndroid Build Coastguard Worker long[].class 274*795d594fSAndroid Build Coastguard Worker } 275*795d594fSAndroid Build Coastguard Worker ), 276*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "methodH", 277*795d594fSAndroid Build Coastguard Worker constantArgumentsForBootstrapMethod = { 278*795d594fSAndroid Build Coastguard Worker @Constant(floatValue = (float) -Math.E), 279*795d594fSAndroid Build Coastguard Worker @Constant(longValue = 999999999999l), 280*795d594fSAndroid Build Coastguard Worker @Constant(longValue = -8888888888888l) 281*795d594fSAndroid Build Coastguard Worker } 282*795d594fSAndroid Build Coastguard Worker ) methodH()283*795d594fSAndroid Build Coastguard Worker private static void methodH() { 284*795d594fSAndroid Build Coastguard Worker System.out.println("methodH"); 285*795d594fSAndroid Build Coastguard Worker } 286*795d594fSAndroid Build Coastguard Worker bsmWithClassAndFloatArray( MethodHandles.Lookup lookup, String methodName, MethodType methodType, Class<?> extraArg, float... arityArgs)287*795d594fSAndroid Build Coastguard Worker private static CallSite bsmWithClassAndFloatArray( 288*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup lookup, 289*795d594fSAndroid Build Coastguard Worker String methodName, 290*795d594fSAndroid Build Coastguard Worker MethodType methodType, 291*795d594fSAndroid Build Coastguard Worker Class<?> extraArg, 292*795d594fSAndroid Build Coastguard Worker float... arityArgs) 293*795d594fSAndroid Build Coastguard Worker throws Throwable { 294*795d594fSAndroid Build Coastguard Worker printBsmArgs( 295*795d594fSAndroid Build Coastguard Worker "bsmWithClassAndFloatArray", lookup, methodName, methodType, extraArg, arityArgs); 296*795d594fSAndroid Build Coastguard Worker MethodHandle mh = lookup.findStatic(lookup.lookupClass(), methodName, methodType); 297*795d594fSAndroid Build Coastguard Worker return new ConstantCallSite(mh); 298*795d594fSAndroid Build Coastguard Worker } 299*795d594fSAndroid Build Coastguard Worker 300*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 301*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 302*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 303*795d594fSAndroid Build Coastguard Worker enclosingType = TestVariableArityLinkerMethod.class, 304*795d594fSAndroid Build Coastguard Worker name = "bsmWithClassAndFloatArray", 305*795d594fSAndroid Build Coastguard Worker parameterTypes = { 306*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 307*795d594fSAndroid Build Coastguard Worker String.class, 308*795d594fSAndroid Build Coastguard Worker MethodType.class, 309*795d594fSAndroid Build Coastguard Worker Class.class, 310*795d594fSAndroid Build Coastguard Worker float[].class 311*795d594fSAndroid Build Coastguard Worker } 312*795d594fSAndroid Build Coastguard Worker ), 313*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "methodI", 314*795d594fSAndroid Build Coastguard Worker constantArgumentsForBootstrapMethod = { 315*795d594fSAndroid Build Coastguard Worker @Constant(classValue = Throwable.class), 316*795d594fSAndroid Build Coastguard Worker @Constant(floatValue = Float.MAX_VALUE), 317*795d594fSAndroid Build Coastguard Worker @Constant(floatValue = Float.MIN_VALUE), 318*795d594fSAndroid Build Coastguard Worker @Constant(floatValue = (float) Math.PI), 319*795d594fSAndroid Build Coastguard Worker @Constant(floatValue = (float) -Math.PI) 320*795d594fSAndroid Build Coastguard Worker } 321*795d594fSAndroid Build Coastguard Worker ) methodI()322*795d594fSAndroid Build Coastguard Worker private static void methodI() { 323*795d594fSAndroid Build Coastguard Worker System.out.println("methodI"); 324*795d594fSAndroid Build Coastguard Worker } 325*795d594fSAndroid Build Coastguard Worker bsmWithDoubleArray( MethodHandles.Lookup lookup, String methodName, MethodType methodType, double... arityArgs)326*795d594fSAndroid Build Coastguard Worker private static CallSite bsmWithDoubleArray( 327*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup lookup, 328*795d594fSAndroid Build Coastguard Worker String methodName, 329*795d594fSAndroid Build Coastguard Worker MethodType methodType, 330*795d594fSAndroid Build Coastguard Worker double... arityArgs) 331*795d594fSAndroid Build Coastguard Worker throws Throwable { 332*795d594fSAndroid Build Coastguard Worker printBsmArgs("bsmWithDoubleArray", lookup, methodName, methodType, arityArgs); 333*795d594fSAndroid Build Coastguard Worker MethodHandle mh = lookup.findStatic(lookup.lookupClass(), methodName, methodType); 334*795d594fSAndroid Build Coastguard Worker return new ConstantCallSite(mh); 335*795d594fSAndroid Build Coastguard Worker } 336*795d594fSAndroid Build Coastguard Worker 337*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 338*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 339*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 340*795d594fSAndroid Build Coastguard Worker enclosingType = TestVariableArityLinkerMethod.class, 341*795d594fSAndroid Build Coastguard Worker name = "bsmWithDoubleArray", 342*795d594fSAndroid Build Coastguard Worker parameterTypes = { 343*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 344*795d594fSAndroid Build Coastguard Worker String.class, 345*795d594fSAndroid Build Coastguard Worker MethodType.class, 346*795d594fSAndroid Build Coastguard Worker double[].class 347*795d594fSAndroid Build Coastguard Worker } 348*795d594fSAndroid Build Coastguard Worker ), 349*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "methodJ", 350*795d594fSAndroid Build Coastguard Worker constantArgumentsForBootstrapMethod = { 351*795d594fSAndroid Build Coastguard Worker @Constant(doubleValue = Double.MAX_VALUE), 352*795d594fSAndroid Build Coastguard Worker @Constant(doubleValue = Double.MIN_VALUE), 353*795d594fSAndroid Build Coastguard Worker @Constant(doubleValue = Math.E), 354*795d594fSAndroid Build Coastguard Worker @Constant(doubleValue = -Math.PI) 355*795d594fSAndroid Build Coastguard Worker } 356*795d594fSAndroid Build Coastguard Worker ) methodJ()357*795d594fSAndroid Build Coastguard Worker private static void methodJ() { 358*795d594fSAndroid Build Coastguard Worker System.out.println("methodJ"); 359*795d594fSAndroid Build Coastguard Worker } 360*795d594fSAndroid Build Coastguard Worker bsmWithClassArray( MethodHandles.Lookup lookup, String methodName, MethodType methodType, Class... arityArgs)361*795d594fSAndroid Build Coastguard Worker private static CallSite bsmWithClassArray( 362*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup lookup, 363*795d594fSAndroid Build Coastguard Worker String methodName, 364*795d594fSAndroid Build Coastguard Worker MethodType methodType, 365*795d594fSAndroid Build Coastguard Worker Class... arityArgs) 366*795d594fSAndroid Build Coastguard Worker throws Throwable { 367*795d594fSAndroid Build Coastguard Worker printBsmArgs("bsmWithClassArray", lookup, methodName, methodType, arityArgs); 368*795d594fSAndroid Build Coastguard Worker MethodHandle mh = lookup.findStatic(lookup.lookupClass(), methodName, methodType); 369*795d594fSAndroid Build Coastguard Worker return new ConstantCallSite(mh); 370*795d594fSAndroid Build Coastguard Worker } 371*795d594fSAndroid Build Coastguard Worker 372*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 373*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 374*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 375*795d594fSAndroid Build Coastguard Worker enclosingType = TestVariableArityLinkerMethod.class, 376*795d594fSAndroid Build Coastguard Worker name = "bsmWithClassArray", 377*795d594fSAndroid Build Coastguard Worker parameterTypes = { 378*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 379*795d594fSAndroid Build Coastguard Worker String.class, 380*795d594fSAndroid Build Coastguard Worker MethodType.class, 381*795d594fSAndroid Build Coastguard Worker Class[].class 382*795d594fSAndroid Build Coastguard Worker } 383*795d594fSAndroid Build Coastguard Worker ), 384*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "methodK", 385*795d594fSAndroid Build Coastguard Worker constantArgumentsForBootstrapMethod = { 386*795d594fSAndroid Build Coastguard Worker @Constant(classValue = Integer.class), 387*795d594fSAndroid Build Coastguard Worker @Constant(classValue = MethodHandles.class), 388*795d594fSAndroid Build Coastguard Worker @Constant(classValue = Arrays.class) 389*795d594fSAndroid Build Coastguard Worker } 390*795d594fSAndroid Build Coastguard Worker ) methodK()391*795d594fSAndroid Build Coastguard Worker private static void methodK() { 392*795d594fSAndroid Build Coastguard Worker System.out.println("methodK"); 393*795d594fSAndroid Build Coastguard Worker } 394*795d594fSAndroid Build Coastguard Worker 395*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 396*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 397*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 398*795d594fSAndroid Build Coastguard Worker enclosingType = TestVariableArityLinkerMethod.class, 399*795d594fSAndroid Build Coastguard Worker name = "bsmWithIntAndStringArray", 400*795d594fSAndroid Build Coastguard Worker parameterTypes = { 401*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 402*795d594fSAndroid Build Coastguard Worker String.class, 403*795d594fSAndroid Build Coastguard Worker MethodType.class, 404*795d594fSAndroid Build Coastguard Worker int.class, 405*795d594fSAndroid Build Coastguard Worker String[].class 406*795d594fSAndroid Build Coastguard Worker } 407*795d594fSAndroid Build Coastguard Worker ), 408*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "methodO", 409*795d594fSAndroid Build Coastguard Worker constantArgumentsForBootstrapMethod = {@Constant(intValue = 103), @Constant(intValue = 104)} 410*795d594fSAndroid Build Coastguard Worker ) methodO()411*795d594fSAndroid Build Coastguard Worker private static void methodO() { 412*795d594fSAndroid Build Coastguard Worker // Arguments are not compatible 413*795d594fSAndroid Build Coastguard Worker assertNotReached(); 414*795d594fSAndroid Build Coastguard Worker } 415*795d594fSAndroid Build Coastguard Worker 416*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 417*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 418*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 419*795d594fSAndroid Build Coastguard Worker enclosingType = TestVariableArityLinkerMethod.class, 420*795d594fSAndroid Build Coastguard Worker name = "bsmWithIntAndStringArray", 421*795d594fSAndroid Build Coastguard Worker parameterTypes = { 422*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 423*795d594fSAndroid Build Coastguard Worker String.class, 424*795d594fSAndroid Build Coastguard Worker MethodType.class, 425*795d594fSAndroid Build Coastguard Worker int.class, 426*795d594fSAndroid Build Coastguard Worker String[].class 427*795d594fSAndroid Build Coastguard Worker } 428*795d594fSAndroid Build Coastguard Worker ), 429*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "methodP", 430*795d594fSAndroid Build Coastguard Worker constantArgumentsForBootstrapMethod = { 431*795d594fSAndroid Build Coastguard Worker @Constant(intValue = 103), 432*795d594fSAndroid Build Coastguard Worker @Constant(stringValue = "A"), 433*795d594fSAndroid Build Coastguard Worker @Constant(stringValue = "B"), 434*795d594fSAndroid Build Coastguard Worker @Constant(intValue = 42) 435*795d594fSAndroid Build Coastguard Worker } 436*795d594fSAndroid Build Coastguard Worker ) methodP()437*795d594fSAndroid Build Coastguard Worker private static void methodP() { 438*795d594fSAndroid Build Coastguard Worker // Arguments are not compatible - specifically, the third 439*795d594fSAndroid Build Coastguard Worker // component of potential collector array is an integer 440*795d594fSAndroid Build Coastguard Worker // argument (42). 441*795d594fSAndroid Build Coastguard Worker assertNotReached(); 442*795d594fSAndroid Build Coastguard Worker } 443*795d594fSAndroid Build Coastguard Worker bsmWithWiderArray( MethodHandles.Lookup lookup, String methodName, MethodType methodType, long[] extraArgs)444*795d594fSAndroid Build Coastguard Worker private static CallSite bsmWithWiderArray( 445*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup lookup, String methodName, MethodType methodType, long[] extraArgs) 446*795d594fSAndroid Build Coastguard Worker throws Throwable { 447*795d594fSAndroid Build Coastguard Worker printBsmArgs("bsmWithWiderArray", lookup, methodName, methodType, extraArgs); 448*795d594fSAndroid Build Coastguard Worker MethodHandle mh = lookup.findStatic(lookup.lookupClass(), methodName, methodType); 449*795d594fSAndroid Build Coastguard Worker return new ConstantCallSite(mh); 450*795d594fSAndroid Build Coastguard Worker } 451*795d594fSAndroid Build Coastguard Worker 452*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 453*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 454*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 455*795d594fSAndroid Build Coastguard Worker enclosingType = TestVariableArityLinkerMethod.class, 456*795d594fSAndroid Build Coastguard Worker name = "bsmWithWiderArray", 457*795d594fSAndroid Build Coastguard Worker parameterTypes = { 458*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 459*795d594fSAndroid Build Coastguard Worker String.class, 460*795d594fSAndroid Build Coastguard Worker MethodType.class, 461*795d594fSAndroid Build Coastguard Worker long[].class 462*795d594fSAndroid Build Coastguard Worker } 463*795d594fSAndroid Build Coastguard Worker ), 464*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "methodQ", 465*795d594fSAndroid Build Coastguard Worker constantArgumentsForBootstrapMethod = {@Constant(intValue = 103), @Constant(intValue = 42)} 466*795d594fSAndroid Build Coastguard Worker ) methodQ()467*795d594fSAndroid Build Coastguard Worker private static void methodQ() { 468*795d594fSAndroid Build Coastguard Worker assertNotReached(); 469*795d594fSAndroid Build Coastguard Worker } 470*795d594fSAndroid Build Coastguard Worker bsmWithBoxedArray( MethodHandles.Lookup lookup, String methodName, MethodType methodType, Integer[] extraArgs)471*795d594fSAndroid Build Coastguard Worker private static CallSite bsmWithBoxedArray( 472*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup lookup, 473*795d594fSAndroid Build Coastguard Worker String methodName, 474*795d594fSAndroid Build Coastguard Worker MethodType methodType, 475*795d594fSAndroid Build Coastguard Worker Integer[] extraArgs) 476*795d594fSAndroid Build Coastguard Worker throws Throwable { 477*795d594fSAndroid Build Coastguard Worker printBsmArgs("bsmWithBoxedArray", lookup, methodName, methodType, extraArgs); 478*795d594fSAndroid Build Coastguard Worker MethodHandle mh = lookup.findStatic(lookup.lookupClass(), methodName, methodType); 479*795d594fSAndroid Build Coastguard Worker return new ConstantCallSite(mh); 480*795d594fSAndroid Build Coastguard Worker } 481*795d594fSAndroid Build Coastguard Worker 482*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 483*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 484*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 485*795d594fSAndroid Build Coastguard Worker enclosingType = TestVariableArityLinkerMethod.class, 486*795d594fSAndroid Build Coastguard Worker name = "bsmWithBoxedArray", 487*795d594fSAndroid Build Coastguard Worker parameterTypes = { 488*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 489*795d594fSAndroid Build Coastguard Worker String.class, 490*795d594fSAndroid Build Coastguard Worker MethodType.class, 491*795d594fSAndroid Build Coastguard Worker Integer[].class 492*795d594fSAndroid Build Coastguard Worker } 493*795d594fSAndroid Build Coastguard Worker ), 494*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "methodR", 495*795d594fSAndroid Build Coastguard Worker constantArgumentsForBootstrapMethod = { 496*795d594fSAndroid Build Coastguard Worker @Constant(intValue = 1030), 497*795d594fSAndroid Build Coastguard Worker @Constant(intValue = 420) 498*795d594fSAndroid Build Coastguard Worker } 499*795d594fSAndroid Build Coastguard Worker ) methodR()500*795d594fSAndroid Build Coastguard Worker private static void methodR() { 501*795d594fSAndroid Build Coastguard Worker assertNotReached(); 502*795d594fSAndroid Build Coastguard Worker } 503*795d594fSAndroid Build Coastguard Worker test()504*795d594fSAndroid Build Coastguard Worker static void test() { 505*795d594fSAndroid Build Coastguard Worker // Happy cases 506*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 507*795d594fSAndroid Build Coastguard Worker methodA(); 508*795d594fSAndroid Build Coastguard Worker methodB(); 509*795d594fSAndroid Build Coastguard Worker methodC(); 510*795d594fSAndroid Build Coastguard Worker } 511*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 2; ++i) { 512*795d594fSAndroid Build Coastguard Worker methodD(); 513*795d594fSAndroid Build Coastguard Worker methodE(); 514*795d594fSAndroid Build Coastguard Worker methodF(); 515*795d594fSAndroid Build Coastguard Worker } 516*795d594fSAndroid Build Coastguard Worker methodG(); 517*795d594fSAndroid Build Coastguard Worker methodH(); 518*795d594fSAndroid Build Coastguard Worker methodI(); 519*795d594fSAndroid Build Coastguard Worker methodJ(); 520*795d594fSAndroid Build Coastguard Worker methodK(); 521*795d594fSAndroid Build Coastguard Worker 522*795d594fSAndroid Build Coastguard Worker // Broken cases 523*795d594fSAndroid Build Coastguard Worker try { 524*795d594fSAndroid Build Coastguard Worker // bsm has incompatible static methods. Collector 525*795d594fSAndroid Build Coastguard Worker // component type is String, the corresponding static 526*795d594fSAndroid Build Coastguard Worker // arguments are int values. 527*795d594fSAndroid Build Coastguard Worker methodO(); 528*795d594fSAndroid Build Coastguard Worker assertNotReached(); 529*795d594fSAndroid Build Coastguard Worker } catch (BootstrapMethodError expected) { 530*795d594fSAndroid Build Coastguard Worker System.out.print("methodO => "); 531*795d594fSAndroid Build Coastguard Worker System.out.print(expected.getClass()); 532*795d594fSAndroid Build Coastguard Worker System.out.print(" => "); 533*795d594fSAndroid Build Coastguard Worker System.out.println(expected.getCause().getClass()); 534*795d594fSAndroid Build Coastguard Worker } 535*795d594fSAndroid Build Coastguard Worker try { 536*795d594fSAndroid Build Coastguard Worker // bsm has a trailing String array for the collector array. 537*795d594fSAndroid Build Coastguard Worker // There is an int value amongst the String values. 538*795d594fSAndroid Build Coastguard Worker methodP(); 539*795d594fSAndroid Build Coastguard Worker assertNotReached(); 540*795d594fSAndroid Build Coastguard Worker } catch (BootstrapMethodError expected) { 541*795d594fSAndroid Build Coastguard Worker System.out.print("methodP => "); 542*795d594fSAndroid Build Coastguard Worker System.out.print(expected.getClass()); 543*795d594fSAndroid Build Coastguard Worker System.out.print(" => "); 544*795d594fSAndroid Build Coastguard Worker System.out.println(expected.getCause().getClass()); 545*795d594fSAndroid Build Coastguard Worker } 546*795d594fSAndroid Build Coastguard Worker try { 547*795d594fSAndroid Build Coastguard Worker // bsm has as trailing long[] element for the collector array. 548*795d594fSAndroid Build Coastguard Worker // The corresponding static bsm arguments are of type int. 549*795d594fSAndroid Build Coastguard Worker methodQ(); 550*795d594fSAndroid Build Coastguard Worker assertNotReached(); 551*795d594fSAndroid Build Coastguard Worker } catch (BootstrapMethodError expected) { 552*795d594fSAndroid Build Coastguard Worker System.out.print("methodQ => "); 553*795d594fSAndroid Build Coastguard Worker System.out.print(expected.getClass()); 554*795d594fSAndroid Build Coastguard Worker System.out.print(" => "); 555*795d594fSAndroid Build Coastguard Worker System.out.println(expected.getCause().getClass()); 556*795d594fSAndroid Build Coastguard Worker } 557*795d594fSAndroid Build Coastguard Worker try { 558*795d594fSAndroid Build Coastguard Worker // bsm has as trailing Integer[] element for the collector array. 559*795d594fSAndroid Build Coastguard Worker // The corresponding static bsm arguments are of type int. 560*795d594fSAndroid Build Coastguard Worker methodR(); 561*795d594fSAndroid Build Coastguard Worker assertNotReached(); 562*795d594fSAndroid Build Coastguard Worker } catch (BootstrapMethodError expected) { 563*795d594fSAndroid Build Coastguard Worker System.out.print("methodR => "); 564*795d594fSAndroid Build Coastguard Worker System.out.print(expected.getClass()); 565*795d594fSAndroid Build Coastguard Worker System.out.print(" => "); 566*795d594fSAndroid Build Coastguard Worker System.out.println(expected.getCause().getClass()); 567*795d594fSAndroid Build Coastguard Worker } 568*795d594fSAndroid Build Coastguard Worker } 569*795d594fSAndroid Build Coastguard Worker } 570