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.lang.invoke.WrongMethodTypeException; 26*795d594fSAndroid Build Coastguard Worker 27*795d594fSAndroid Build Coastguard Worker public class TestBadBootstrapArguments extends TestBase { bsm( MethodHandles.Lookup lookup, String methodName, MethodType methodType, int extraInt, String extraString)28*795d594fSAndroid Build Coastguard Worker private static CallSite bsm( 29*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup lookup, 30*795d594fSAndroid Build Coastguard Worker String methodName, 31*795d594fSAndroid Build Coastguard Worker MethodType methodType, 32*795d594fSAndroid Build Coastguard Worker int extraInt, 33*795d594fSAndroid Build Coastguard Worker String extraString) 34*795d594fSAndroid Build Coastguard Worker throws Throwable { 35*795d594fSAndroid Build Coastguard Worker System.out.print("bsm("); 36*795d594fSAndroid Build Coastguard Worker System.out.print(lookup.lookupClass()); 37*795d594fSAndroid Build Coastguard Worker System.out.print(", "); 38*795d594fSAndroid Build Coastguard Worker System.out.print(methodName); 39*795d594fSAndroid Build Coastguard Worker System.out.print(", "); 40*795d594fSAndroid Build Coastguard Worker System.out.print(methodType); 41*795d594fSAndroid Build Coastguard Worker System.out.print(", "); 42*795d594fSAndroid Build Coastguard Worker System.out.print(extraInt); 43*795d594fSAndroid Build Coastguard Worker System.out.print(", "); 44*795d594fSAndroid Build Coastguard Worker System.out.print(extraString); 45*795d594fSAndroid Build Coastguard Worker System.out.println(")"); 46*795d594fSAndroid Build Coastguard Worker MethodHandle mh = lookup.findStatic(lookup.lookupClass(), methodName, methodType); 47*795d594fSAndroid Build Coastguard Worker return new ConstantCallSite(mh); 48*795d594fSAndroid Build Coastguard Worker } 49*795d594fSAndroid Build Coastguard Worker 50*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 51*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 52*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 53*795d594fSAndroid Build Coastguard Worker enclosingType = TestBadBootstrapArguments.class, 54*795d594fSAndroid Build Coastguard Worker name = "bsm", 55*795d594fSAndroid Build Coastguard Worker parameterTypes = { 56*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 57*795d594fSAndroid Build Coastguard Worker String.class, 58*795d594fSAndroid Build Coastguard Worker MethodType.class, 59*795d594fSAndroid Build Coastguard Worker int.class, 60*795d594fSAndroid Build Coastguard Worker String.class 61*795d594fSAndroid Build Coastguard Worker } 62*795d594fSAndroid Build Coastguard Worker ), 63*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "happy", 64*795d594fSAndroid Build Coastguard Worker constantArgumentsForBootstrapMethod = { 65*795d594fSAndroid Build Coastguard Worker @Constant(intValue = -1), 66*795d594fSAndroid Build Coastguard Worker @Constant(stringValue = "very") 67*795d594fSAndroid Build Coastguard Worker } 68*795d594fSAndroid Build Coastguard Worker ) invokeHappy()69*795d594fSAndroid Build Coastguard Worker private static void invokeHappy() { 70*795d594fSAndroid Build Coastguard Worker assertNotReached(); 71*795d594fSAndroid Build Coastguard Worker } 72*795d594fSAndroid Build Coastguard Worker happy()73*795d594fSAndroid Build Coastguard Worker private static void happy() { 74*795d594fSAndroid Build Coastguard Worker System.out.println("happy"); 75*795d594fSAndroid Build Coastguard Worker } 76*795d594fSAndroid Build Coastguard Worker 77*795d594fSAndroid Build Coastguard Worker // BootstrapMethod.parameterTypes != parameterTypesOf(constantArgumentsForBootstrapMethod) 78*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 79*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 80*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 81*795d594fSAndroid Build Coastguard Worker enclosingType = TestBadBootstrapArguments.class, 82*795d594fSAndroid Build Coastguard Worker name = "bsm", 83*795d594fSAndroid Build Coastguard Worker parameterTypes = { 84*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 85*795d594fSAndroid Build Coastguard Worker String.class, 86*795d594fSAndroid Build Coastguard Worker MethodType.class, 87*795d594fSAndroid Build Coastguard Worker int.class, 88*795d594fSAndroid Build Coastguard Worker double.class 89*795d594fSAndroid Build Coastguard Worker } 90*795d594fSAndroid Build Coastguard Worker ), 91*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "wrongParameterTypes", 92*795d594fSAndroid Build Coastguard Worker constantArgumentsForBootstrapMethod = { 93*795d594fSAndroid Build Coastguard Worker @Constant(intValue = -1), 94*795d594fSAndroid Build Coastguard Worker @Constant(stringValue = "very") 95*795d594fSAndroid Build Coastguard Worker } 96*795d594fSAndroid Build Coastguard Worker ) invokeWrongParameterTypes()97*795d594fSAndroid Build Coastguard Worker private static void invokeWrongParameterTypes() throws NoSuchMethodError { 98*795d594fSAndroid Build Coastguard Worker assertNotReached(); 99*795d594fSAndroid Build Coastguard Worker } 100*795d594fSAndroid Build Coastguard Worker wrongParameterTypes()101*795d594fSAndroid Build Coastguard Worker private static void wrongParameterTypes() { 102*795d594fSAndroid Build Coastguard Worker System.out.println("wrongParameterTypes"); 103*795d594fSAndroid Build Coastguard Worker } 104*795d594fSAndroid Build Coastguard Worker 105*795d594fSAndroid Build Coastguard Worker // BootstrapMethod.parameterTypes != parameterTypesOf(constantArgumentsForBootstrapMethod) 106*795d594fSAndroid Build Coastguard Worker // (missing constantArgumentTypes)) 107*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 108*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 109*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 110*795d594fSAndroid Build Coastguard Worker enclosingType = TestBadBootstrapArguments.class, 111*795d594fSAndroid Build Coastguard Worker name = "bsm", 112*795d594fSAndroid Build Coastguard Worker parameterTypes = { 113*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 114*795d594fSAndroid Build Coastguard Worker String.class, 115*795d594fSAndroid Build Coastguard Worker MethodType.class, 116*795d594fSAndroid Build Coastguard Worker int.class, 117*795d594fSAndroid Build Coastguard Worker double.class 118*795d594fSAndroid Build Coastguard Worker } 119*795d594fSAndroid Build Coastguard Worker ), 120*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "missingParameterTypes", 121*795d594fSAndroid Build Coastguard Worker constantArgumentsForBootstrapMethod = {} 122*795d594fSAndroid Build Coastguard Worker ) invokeMissingParameterTypes()123*795d594fSAndroid Build Coastguard Worker private static void invokeMissingParameterTypes() throws NoSuchMethodError { 124*795d594fSAndroid Build Coastguard Worker assertNotReached(); 125*795d594fSAndroid Build Coastguard Worker } 126*795d594fSAndroid Build Coastguard Worker missingParameterTypes()127*795d594fSAndroid Build Coastguard Worker private static void missingParameterTypes() { 128*795d594fSAndroid Build Coastguard Worker System.out.println("missingParameterTypes"); 129*795d594fSAndroid Build Coastguard Worker } 130*795d594fSAndroid Build Coastguard Worker 131*795d594fSAndroid Build Coastguard Worker // BootstrapMethod.parameterTypes != parameterTypesOf(constantArgumentsForBootstrapMethod): 132*795d594fSAndroid Build Coastguard Worker // extra constant present 133*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 134*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 135*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 136*795d594fSAndroid Build Coastguard Worker enclosingType = TestBadBootstrapArguments.class, 137*795d594fSAndroid Build Coastguard Worker name = "bsm", 138*795d594fSAndroid Build Coastguard Worker parameterTypes = { 139*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 140*795d594fSAndroid Build Coastguard Worker String.class, 141*795d594fSAndroid Build Coastguard Worker MethodType.class, 142*795d594fSAndroid Build Coastguard Worker int.class, 143*795d594fSAndroid Build Coastguard Worker String.class 144*795d594fSAndroid Build Coastguard Worker } 145*795d594fSAndroid Build Coastguard Worker ), 146*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "extraArguments", 147*795d594fSAndroid Build Coastguard Worker constantArgumentsForBootstrapMethod = { 148*795d594fSAndroid Build Coastguard Worker @Constant(intValue = 1), 149*795d594fSAndroid Build Coastguard Worker @Constant(stringValue = "2"), 150*795d594fSAndroid Build Coastguard Worker @Constant(intValue = 3) 151*795d594fSAndroid Build Coastguard Worker } 152*795d594fSAndroid Build Coastguard Worker ) invokeExtraArguments()153*795d594fSAndroid Build Coastguard Worker private static void invokeExtraArguments() { 154*795d594fSAndroid Build Coastguard Worker assertNotReached(); 155*795d594fSAndroid Build Coastguard Worker } 156*795d594fSAndroid Build Coastguard Worker extraArguments()157*795d594fSAndroid Build Coastguard Worker private static void extraArguments() { 158*795d594fSAndroid Build Coastguard Worker System.out.println("extraArguments"); 159*795d594fSAndroid Build Coastguard Worker } 160*795d594fSAndroid Build Coastguard Worker 161*795d594fSAndroid Build Coastguard Worker // constantArgumentTypes do not correspond to expected parameter types 162*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 163*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 164*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 165*795d594fSAndroid Build Coastguard Worker enclosingType = TestBadBootstrapArguments.class, 166*795d594fSAndroid Build Coastguard Worker name = "bsm", 167*795d594fSAndroid Build Coastguard Worker parameterTypes = { 168*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 169*795d594fSAndroid Build Coastguard Worker String.class, 170*795d594fSAndroid Build Coastguard Worker MethodType.class, 171*795d594fSAndroid Build Coastguard Worker int.class, 172*795d594fSAndroid Build Coastguard Worker String.class 173*795d594fSAndroid Build Coastguard Worker } 174*795d594fSAndroid Build Coastguard Worker ), 175*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "wrongArguments", 176*795d594fSAndroid Build Coastguard Worker constantArgumentsForBootstrapMethod = { 177*795d594fSAndroid Build Coastguard Worker @Constant(stringValue = "1"), 178*795d594fSAndroid Build Coastguard Worker @Constant(doubleValue = Math.PI) 179*795d594fSAndroid Build Coastguard Worker } 180*795d594fSAndroid Build Coastguard Worker ) invokeWrongArguments()181*795d594fSAndroid Build Coastguard Worker private static void invokeWrongArguments() { 182*795d594fSAndroid Build Coastguard Worker assertNotReached(); 183*795d594fSAndroid Build Coastguard Worker } 184*795d594fSAndroid Build Coastguard Worker wrongArguments()185*795d594fSAndroid Build Coastguard Worker private static void wrongArguments() { 186*795d594fSAndroid Build Coastguard Worker System.out.println("wrongArguments"); 187*795d594fSAndroid Build Coastguard Worker } 188*795d594fSAndroid Build Coastguard Worker 189*795d594fSAndroid Build Coastguard Worker // constantArgumentTypes do not correspond to expected parameter types 190*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 191*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 192*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 193*795d594fSAndroid Build Coastguard Worker enclosingType = TestBadBootstrapArguments.class, 194*795d594fSAndroid Build Coastguard Worker name = "bsm", 195*795d594fSAndroid Build Coastguard Worker parameterTypes = { 196*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 197*795d594fSAndroid Build Coastguard Worker String.class, 198*795d594fSAndroid Build Coastguard Worker MethodType.class, 199*795d594fSAndroid Build Coastguard Worker int.class, 200*795d594fSAndroid Build Coastguard Worker String.class 201*795d594fSAndroid Build Coastguard Worker } 202*795d594fSAndroid Build Coastguard Worker ), 203*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "wrongArgumentsAgain", 204*795d594fSAndroid Build Coastguard Worker constantArgumentsForBootstrapMethod = { 205*795d594fSAndroid Build Coastguard Worker @Constant(doubleValue = Math.PI), 206*795d594fSAndroid Build Coastguard Worker @Constant(stringValue = "pie") 207*795d594fSAndroid Build Coastguard Worker } 208*795d594fSAndroid Build Coastguard Worker ) invokeWrongArgumentsAgain()209*795d594fSAndroid Build Coastguard Worker private static void invokeWrongArgumentsAgain() { 210*795d594fSAndroid Build Coastguard Worker assertNotReached(); 211*795d594fSAndroid Build Coastguard Worker } 212*795d594fSAndroid Build Coastguard Worker wrongArgumentsAgain()213*795d594fSAndroid Build Coastguard Worker private static void wrongArgumentsAgain() { 214*795d594fSAndroid Build Coastguard Worker System.out.println("wrongArgumentsAgain"); 215*795d594fSAndroid Build Coastguard Worker } 216*795d594fSAndroid Build Coastguard Worker 217*795d594fSAndroid Build Coastguard Worker // Primitive argument types not supported {Z, B, C, S}. bsmZBCS( MethodHandles.Lookup lookup, String methodName, MethodType methodType, boolean extraArg0, byte extraArg1, char extraArg2, short extraArg3)218*795d594fSAndroid Build Coastguard Worker private static CallSite bsmZBCS( 219*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup lookup, 220*795d594fSAndroid Build Coastguard Worker String methodName, 221*795d594fSAndroid Build Coastguard Worker MethodType methodType, 222*795d594fSAndroid Build Coastguard Worker boolean extraArg0, 223*795d594fSAndroid Build Coastguard Worker byte extraArg1, 224*795d594fSAndroid Build Coastguard Worker char extraArg2, 225*795d594fSAndroid Build Coastguard Worker short extraArg3) 226*795d594fSAndroid Build Coastguard Worker throws Throwable { 227*795d594fSAndroid Build Coastguard Worker assertNotReached(); 228*795d594fSAndroid Build Coastguard Worker return null; 229*795d594fSAndroid Build Coastguard Worker } 230*795d594fSAndroid Build Coastguard Worker 231*795d594fSAndroid Build Coastguard Worker // Arguments are narrower than supported. 232*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 233*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 234*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 235*795d594fSAndroid Build Coastguard Worker enclosingType = TestBadBootstrapArguments.class, 236*795d594fSAndroid Build Coastguard Worker name = "bsmZBCS", 237*795d594fSAndroid Build Coastguard Worker parameterTypes = { 238*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 239*795d594fSAndroid Build Coastguard Worker String.class, 240*795d594fSAndroid Build Coastguard Worker MethodType.class, 241*795d594fSAndroid Build Coastguard Worker boolean.class, 242*795d594fSAndroid Build Coastguard Worker byte.class, 243*795d594fSAndroid Build Coastguard Worker char.class, 244*795d594fSAndroid Build Coastguard Worker short.class 245*795d594fSAndroid Build Coastguard Worker } 246*795d594fSAndroid Build Coastguard Worker ), 247*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "narrowArguments", 248*795d594fSAndroid Build Coastguard Worker constantArgumentsForBootstrapMethod = { 249*795d594fSAndroid Build Coastguard Worker @Constant(booleanValue = true), 250*795d594fSAndroid Build Coastguard Worker @Constant(byteValue = Byte.MAX_VALUE), 251*795d594fSAndroid Build Coastguard Worker @Constant(charValue = 'A'), 252*795d594fSAndroid Build Coastguard Worker @Constant(shortValue = Short.MIN_VALUE) 253*795d594fSAndroid Build Coastguard Worker } 254*795d594fSAndroid Build Coastguard Worker ) invokeNarrowArguments()255*795d594fSAndroid Build Coastguard Worker private static void invokeNarrowArguments() { 256*795d594fSAndroid Build Coastguard Worker assertNotReached(); 257*795d594fSAndroid Build Coastguard Worker } 258*795d594fSAndroid Build Coastguard Worker narrowArguments()259*795d594fSAndroid Build Coastguard Worker private static void narrowArguments() { 260*795d594fSAndroid Build Coastguard Worker assertNotReached(); 261*795d594fSAndroid Build Coastguard Worker } 262*795d594fSAndroid Build Coastguard Worker bsmDJ( MethodHandles.Lookup lookup, String methodName, MethodType methodType, double extraArg0, long extraArg1)263*795d594fSAndroid Build Coastguard Worker private static CallSite bsmDJ( 264*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup lookup, 265*795d594fSAndroid Build Coastguard Worker String methodName, 266*795d594fSAndroid Build Coastguard Worker MethodType methodType, 267*795d594fSAndroid Build Coastguard Worker double extraArg0, 268*795d594fSAndroid Build Coastguard Worker long extraArg1) 269*795d594fSAndroid Build Coastguard Worker throws Throwable { 270*795d594fSAndroid Build Coastguard Worker System.out.print("bsmDJ(..., "); 271*795d594fSAndroid Build Coastguard Worker System.out.print(extraArg0); 272*795d594fSAndroid Build Coastguard Worker System.out.print(", "); 273*795d594fSAndroid Build Coastguard Worker System.out.print(extraArg1); 274*795d594fSAndroid Build Coastguard Worker System.out.println(")"); 275*795d594fSAndroid Build Coastguard Worker MethodHandle mh = lookup.findStatic(lookup.lookupClass(), methodName, methodType); 276*795d594fSAndroid Build Coastguard Worker return new ConstantCallSite(mh); 277*795d594fSAndroid Build Coastguard Worker } 278*795d594fSAndroid Build Coastguard Worker 279*795d594fSAndroid Build Coastguard Worker // Arguments need widening to parameter types. 280*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 281*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 282*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 283*795d594fSAndroid Build Coastguard Worker enclosingType = TestBadBootstrapArguments.class, 284*795d594fSAndroid Build Coastguard Worker name = "bsmDJ", 285*795d594fSAndroid Build Coastguard Worker parameterTypes = { 286*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 287*795d594fSAndroid Build Coastguard Worker String.class, 288*795d594fSAndroid Build Coastguard Worker MethodType.class, 289*795d594fSAndroid Build Coastguard Worker double.class, 290*795d594fSAndroid Build Coastguard Worker long.class 291*795d594fSAndroid Build Coastguard Worker } 292*795d594fSAndroid Build Coastguard Worker ), 293*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "wideningArguments", 294*795d594fSAndroid Build Coastguard Worker constantArgumentsForBootstrapMethod = { 295*795d594fSAndroid Build Coastguard Worker @Constant(doubleValue = Double.MAX_VALUE), 296*795d594fSAndroid Build Coastguard Worker @Constant(intValue = Integer.MAX_VALUE) 297*795d594fSAndroid Build Coastguard Worker } 298*795d594fSAndroid Build Coastguard Worker ) invokeWideningArguments()299*795d594fSAndroid Build Coastguard Worker private static void invokeWideningArguments() { 300*795d594fSAndroid Build Coastguard Worker assertNotReached(); 301*795d594fSAndroid Build Coastguard Worker } 302*795d594fSAndroid Build Coastguard Worker wideningArguments()303*795d594fSAndroid Build Coastguard Worker private static void wideningArguments() { 304*795d594fSAndroid Build Coastguard Worker System.out.println("wideningArguments"); 305*795d594fSAndroid Build Coastguard Worker } 306*795d594fSAndroid Build Coastguard Worker bsmDoubleLong( MethodHandles.Lookup lookup, String methodName, MethodType methodType, Double extraArg0, Long extraArg1)307*795d594fSAndroid Build Coastguard Worker private static CallSite bsmDoubleLong( 308*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup lookup, 309*795d594fSAndroid Build Coastguard Worker String methodName, 310*795d594fSAndroid Build Coastguard Worker MethodType methodType, 311*795d594fSAndroid Build Coastguard Worker Double extraArg0, 312*795d594fSAndroid Build Coastguard Worker Long extraArg1) 313*795d594fSAndroid Build Coastguard Worker throws Throwable { 314*795d594fSAndroid Build Coastguard Worker System.out.print("bsmDoubleLong(..., "); 315*795d594fSAndroid Build Coastguard Worker System.out.print(extraArg0); 316*795d594fSAndroid Build Coastguard Worker System.out.print(", "); 317*795d594fSAndroid Build Coastguard Worker System.out.print(extraArg1); 318*795d594fSAndroid Build Coastguard Worker System.out.println(")"); 319*795d594fSAndroid Build Coastguard Worker MethodHandle mh = lookup.findStatic(lookup.lookupClass(), methodName, methodType); 320*795d594fSAndroid Build Coastguard Worker return new ConstantCallSite(mh); 321*795d594fSAndroid Build Coastguard Worker } 322*795d594fSAndroid Build Coastguard Worker 323*795d594fSAndroid Build Coastguard Worker // Arguments need boxing to parameter types 324*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 325*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 326*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 327*795d594fSAndroid Build Coastguard Worker enclosingType = TestBadBootstrapArguments.class, 328*795d594fSAndroid Build Coastguard Worker name = "bsmDoubleLong", 329*795d594fSAndroid Build Coastguard Worker parameterTypes = { 330*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 331*795d594fSAndroid Build Coastguard Worker String.class, 332*795d594fSAndroid Build Coastguard Worker MethodType.class, 333*795d594fSAndroid Build Coastguard Worker Double.class, 334*795d594fSAndroid Build Coastguard Worker Long.class 335*795d594fSAndroid Build Coastguard Worker } 336*795d594fSAndroid Build Coastguard Worker ), 337*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "boxingArguments", 338*795d594fSAndroid Build Coastguard Worker constantArgumentsForBootstrapMethod = { 339*795d594fSAndroid Build Coastguard Worker @Constant(doubleValue = Double.MAX_VALUE), 340*795d594fSAndroid Build Coastguard Worker @Constant(longValue = Long.MAX_VALUE) 341*795d594fSAndroid Build Coastguard Worker } 342*795d594fSAndroid Build Coastguard Worker ) invokeBoxingArguments()343*795d594fSAndroid Build Coastguard Worker private static void invokeBoxingArguments() { 344*795d594fSAndroid Build Coastguard Worker assertNotReached(); 345*795d594fSAndroid Build Coastguard Worker } 346*795d594fSAndroid Build Coastguard Worker boxingArguments()347*795d594fSAndroid Build Coastguard Worker private static void boxingArguments() { 348*795d594fSAndroid Build Coastguard Worker System.out.println("boxingArguments"); 349*795d594fSAndroid Build Coastguard Worker } 350*795d594fSAndroid Build Coastguard Worker 351*795d594fSAndroid Build Coastguard Worker // Arguments need widening and boxing to parameter types 352*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 353*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 354*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 355*795d594fSAndroid Build Coastguard Worker enclosingType = TestBadBootstrapArguments.class, 356*795d594fSAndroid Build Coastguard Worker name = "bsmDoubleLong", 357*795d594fSAndroid Build Coastguard Worker parameterTypes = { 358*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup.class, 359*795d594fSAndroid Build Coastguard Worker String.class, 360*795d594fSAndroid Build Coastguard Worker MethodType.class, 361*795d594fSAndroid Build Coastguard Worker Double.class, 362*795d594fSAndroid Build Coastguard Worker Long.class 363*795d594fSAndroid Build Coastguard Worker } 364*795d594fSAndroid Build Coastguard Worker ), 365*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "wideningBoxingArguments", 366*795d594fSAndroid Build Coastguard Worker constantArgumentsForBootstrapMethod = { 367*795d594fSAndroid Build Coastguard Worker @Constant(floatValue = Float.MAX_VALUE), 368*795d594fSAndroid Build Coastguard Worker @Constant(longValue = Integer.MAX_VALUE) 369*795d594fSAndroid Build Coastguard Worker } 370*795d594fSAndroid Build Coastguard Worker ) invokeWideningBoxingArguments()371*795d594fSAndroid Build Coastguard Worker private static void invokeWideningBoxingArguments() { 372*795d594fSAndroid Build Coastguard Worker assertNotReached(); 373*795d594fSAndroid Build Coastguard Worker } 374*795d594fSAndroid Build Coastguard Worker wideningBoxingArguments()375*795d594fSAndroid Build Coastguard Worker private static void wideningBoxingArguments() { 376*795d594fSAndroid Build Coastguard Worker System.out.println("wideningBoxingArguments"); 377*795d594fSAndroid Build Coastguard Worker } 378*795d594fSAndroid Build Coastguard Worker bsmReturningVoid(MethodHandles.Lookup lookup, String name, MethodType type)379*795d594fSAndroid Build Coastguard Worker static void bsmReturningVoid(MethodHandles.Lookup lookup, String name, MethodType type) { 380*795d594fSAndroid Build Coastguard Worker System.out.println("bsm returning void value."); 381*795d594fSAndroid Build Coastguard Worker } 382*795d594fSAndroid Build Coastguard Worker 383*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 384*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 385*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 386*795d594fSAndroid Build Coastguard Worker enclosingType = TestBadBootstrapArguments.class, 387*795d594fSAndroid Build Coastguard Worker name = "bsmReturningVoid", 388*795d594fSAndroid Build Coastguard Worker parameterTypes = {MethodHandles.Lookup.class, String.class, MethodType.class}, 389*795d594fSAndroid Build Coastguard Worker returnType = void.class 390*795d594fSAndroid Build Coastguard Worker ), 391*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "voidReturnType" 392*795d594fSAndroid Build Coastguard Worker ) invokeVoidReturnType()393*795d594fSAndroid Build Coastguard Worker private static void invokeVoidReturnType() { 394*795d594fSAndroid Build Coastguard Worker assertNotReached(); 395*795d594fSAndroid Build Coastguard Worker } 396*795d594fSAndroid Build Coastguard Worker voidReturnType()397*795d594fSAndroid Build Coastguard Worker private static void voidReturnType() { 398*795d594fSAndroid Build Coastguard Worker assertNotReached(); 399*795d594fSAndroid Build Coastguard Worker } 400*795d594fSAndroid Build Coastguard Worker bsmReturningObject(MethodHandles.Lookup lookup, String name, MethodType type)401*795d594fSAndroid Build Coastguard Worker static Object bsmReturningObject(MethodHandles.Lookup lookup, String name, MethodType type) { 402*795d594fSAndroid Build Coastguard Worker System.out.println("bsm returning Object value."); 403*795d594fSAndroid Build Coastguard Worker return new Object(); 404*795d594fSAndroid Build Coastguard Worker } 405*795d594fSAndroid Build Coastguard Worker 406*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 407*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 408*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 409*795d594fSAndroid Build Coastguard Worker enclosingType = TestBadBootstrapArguments.class, 410*795d594fSAndroid Build Coastguard Worker name = "bsmReturningObject", 411*795d594fSAndroid Build Coastguard Worker parameterTypes = {MethodHandles.Lookup.class, String.class, MethodType.class}, 412*795d594fSAndroid Build Coastguard Worker returnType = Object.class 413*795d594fSAndroid Build Coastguard Worker ), 414*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "ObjectReturnType" 415*795d594fSAndroid Build Coastguard Worker ) invokeObjectReturnType()416*795d594fSAndroid Build Coastguard Worker private static void invokeObjectReturnType() { 417*795d594fSAndroid Build Coastguard Worker assertNotReached(); 418*795d594fSAndroid Build Coastguard Worker } 419*795d594fSAndroid Build Coastguard Worker objectReturnType()420*795d594fSAndroid Build Coastguard Worker private static void objectReturnType() { 421*795d594fSAndroid Build Coastguard Worker assertNotReached(); 422*795d594fSAndroid Build Coastguard Worker } 423*795d594fSAndroid Build Coastguard Worker bsmReturningInteger(MethodHandles.Lookup lookup, String name, MethodType type)424*795d594fSAndroid Build Coastguard Worker static Integer bsmReturningInteger(MethodHandles.Lookup lookup, String name, MethodType type) { 425*795d594fSAndroid Build Coastguard Worker System.out.println("bsm returning Integer value."); 426*795d594fSAndroid Build Coastguard Worker return Integer.valueOf(3); 427*795d594fSAndroid Build Coastguard Worker } 428*795d594fSAndroid Build Coastguard Worker 429*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 430*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 431*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 432*795d594fSAndroid Build Coastguard Worker enclosingType = TestBadBootstrapArguments.class, 433*795d594fSAndroid Build Coastguard Worker name = "bsmReturningInteger", 434*795d594fSAndroid Build Coastguard Worker parameterTypes = {MethodHandles.Lookup.class, String.class, MethodType.class}, 435*795d594fSAndroid Build Coastguard Worker returnType = Integer.class 436*795d594fSAndroid Build Coastguard Worker ), 437*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "integerReturnType" 438*795d594fSAndroid Build Coastguard Worker ) invokeIntegerReturnType()439*795d594fSAndroid Build Coastguard Worker private static void invokeIntegerReturnType() { 440*795d594fSAndroid Build Coastguard Worker assertNotReached(); 441*795d594fSAndroid Build Coastguard Worker } 442*795d594fSAndroid Build Coastguard Worker integerReturnType()443*795d594fSAndroid Build Coastguard Worker private static void integerReturnType() { 444*795d594fSAndroid Build Coastguard Worker assertNotReached(); 445*795d594fSAndroid Build Coastguard Worker } 446*795d594fSAndroid Build Coastguard Worker 447*795d594fSAndroid Build Coastguard Worker static class TestersConstantCallSite extends ConstantCallSite { TestersConstantCallSite(MethodHandle mh)448*795d594fSAndroid Build Coastguard Worker public TestersConstantCallSite(MethodHandle mh) { 449*795d594fSAndroid Build Coastguard Worker super(mh); 450*795d594fSAndroid Build Coastguard Worker } 451*795d594fSAndroid Build Coastguard Worker } 452*795d594fSAndroid Build Coastguard Worker bsmReturningTestersConstantCallsite( MethodHandles.Lookup lookup, String name, MethodType type)453*795d594fSAndroid Build Coastguard Worker static TestersConstantCallSite bsmReturningTestersConstantCallsite( 454*795d594fSAndroid Build Coastguard Worker MethodHandles.Lookup lookup, String name, MethodType type) throws Throwable { 455*795d594fSAndroid Build Coastguard Worker return new TestersConstantCallSite(lookup.findStatic(lookup.lookupClass(), name, type)); 456*795d594fSAndroid Build Coastguard Worker } 457*795d594fSAndroid Build Coastguard Worker 458*795d594fSAndroid Build Coastguard Worker @CalledByIndy( 459*795d594fSAndroid Build Coastguard Worker bootstrapMethod = 460*795d594fSAndroid Build Coastguard Worker @BootstrapMethod( 461*795d594fSAndroid Build Coastguard Worker enclosingType = TestBadBootstrapArguments.class, 462*795d594fSAndroid Build Coastguard Worker name = "bsmReturningTestersConstantCallsite", 463*795d594fSAndroid Build Coastguard Worker parameterTypes = {MethodHandles.Lookup.class, String.class, MethodType.class}, 464*795d594fSAndroid Build Coastguard Worker returnType = TestersConstantCallSite.class 465*795d594fSAndroid Build Coastguard Worker ), 466*795d594fSAndroid Build Coastguard Worker fieldOrMethodName = "sayHello" 467*795d594fSAndroid Build Coastguard Worker ) invokeViaCustomCallSiteClass()468*795d594fSAndroid Build Coastguard Worker private static void invokeViaCustomCallSiteClass() { 469*795d594fSAndroid Build Coastguard Worker assertNotReached(); 470*795d594fSAndroid Build Coastguard Worker } 471*795d594fSAndroid Build Coastguard Worker sayHello()472*795d594fSAndroid Build Coastguard Worker private static void sayHello() { 473*795d594fSAndroid Build Coastguard Worker System.out.println("Hello!"); 474*795d594fSAndroid Build Coastguard Worker } 475*795d594fSAndroid Build Coastguard Worker test()476*795d594fSAndroid Build Coastguard Worker static void test() { 477*795d594fSAndroid Build Coastguard Worker System.out.println("TestBadBootstrapArguments"); 478*795d594fSAndroid Build Coastguard Worker invokeHappy(); 479*795d594fSAndroid Build Coastguard Worker try { 480*795d594fSAndroid Build Coastguard Worker invokeWrongParameterTypes(); 481*795d594fSAndroid Build Coastguard Worker assertNotReached(); 482*795d594fSAndroid Build Coastguard Worker } catch (NoSuchMethodError expected) { 483*795d594fSAndroid Build Coastguard Worker System.out.print("invokeWrongParameterTypes => "); 484*795d594fSAndroid Build Coastguard Worker System.out.println(expected.getClass()); 485*795d594fSAndroid Build Coastguard Worker } 486*795d594fSAndroid Build Coastguard Worker try { 487*795d594fSAndroid Build Coastguard Worker invokeMissingParameterTypes(); 488*795d594fSAndroid Build Coastguard Worker assertNotReached(); 489*795d594fSAndroid Build Coastguard Worker } catch (NoSuchMethodError expected) { 490*795d594fSAndroid Build Coastguard Worker System.out.print("invokeMissingParameterTypes => "); 491*795d594fSAndroid Build Coastguard Worker System.out.println(expected.getClass()); 492*795d594fSAndroid Build Coastguard Worker } 493*795d594fSAndroid Build Coastguard Worker try { 494*795d594fSAndroid Build Coastguard Worker invokeExtraArguments(); 495*795d594fSAndroid Build Coastguard Worker assertNotReached(); 496*795d594fSAndroid Build Coastguard Worker } catch (BootstrapMethodError expected) { 497*795d594fSAndroid Build Coastguard Worker assertEquals(WrongMethodTypeException.class, expected.getCause().getClass()); 498*795d594fSAndroid Build Coastguard Worker System.out.print("invokeExtraArguments => "); 499*795d594fSAndroid Build Coastguard Worker System.out.print(expected.getClass()); 500*795d594fSAndroid Build Coastguard Worker System.out.print(" => "); 501*795d594fSAndroid Build Coastguard Worker System.out.println(expected.getCause().getClass()); 502*795d594fSAndroid Build Coastguard Worker } 503*795d594fSAndroid Build Coastguard Worker try { 504*795d594fSAndroid Build Coastguard Worker invokeWrongArguments(); 505*795d594fSAndroid Build Coastguard Worker assertNotReached(); 506*795d594fSAndroid Build Coastguard Worker } catch (BootstrapMethodError expected) { 507*795d594fSAndroid Build Coastguard Worker assertEquals(ClassCastException.class, expected.getCause().getClass()); 508*795d594fSAndroid Build Coastguard Worker System.out.print("invokeWrongArguments => "); 509*795d594fSAndroid Build Coastguard Worker System.out.print(expected.getClass()); 510*795d594fSAndroid Build Coastguard Worker System.out.print(" => "); 511*795d594fSAndroid Build Coastguard Worker System.out.println(expected.getCause().getClass()); 512*795d594fSAndroid Build Coastguard Worker } 513*795d594fSAndroid Build Coastguard Worker try { 514*795d594fSAndroid Build Coastguard Worker invokeWrongArguments(); 515*795d594fSAndroid Build Coastguard Worker assertNotReached(); 516*795d594fSAndroid Build Coastguard Worker } catch (BootstrapMethodError expected) { 517*795d594fSAndroid Build Coastguard Worker assertEquals(ClassCastException.class, expected.getCause().getClass()); 518*795d594fSAndroid Build Coastguard Worker System.out.print("invokeWrongArguments => "); 519*795d594fSAndroid Build Coastguard Worker System.out.print(expected.getClass()); 520*795d594fSAndroid Build Coastguard Worker System.out.print(" => "); 521*795d594fSAndroid Build Coastguard Worker System.out.println(expected.getCause().getClass()); 522*795d594fSAndroid Build Coastguard Worker } 523*795d594fSAndroid Build Coastguard Worker try { 524*795d594fSAndroid Build Coastguard Worker invokeWrongArgumentsAgain(); 525*795d594fSAndroid Build Coastguard Worker assertNotReached(); 526*795d594fSAndroid Build Coastguard Worker } catch (BootstrapMethodError expected) { 527*795d594fSAndroid Build Coastguard Worker assertEquals(ClassCastException.class, expected.getCause().getClass()); 528*795d594fSAndroid Build Coastguard Worker System.out.print("invokeWrongArgumentsAgain => "); 529*795d594fSAndroid Build Coastguard Worker System.out.print(expected.getClass()); 530*795d594fSAndroid Build Coastguard Worker System.out.print(" => "); 531*795d594fSAndroid Build Coastguard Worker System.out.println(expected.getCause().getClass()); 532*795d594fSAndroid Build Coastguard Worker } 533*795d594fSAndroid Build Coastguard Worker try { 534*795d594fSAndroid Build Coastguard Worker invokeNarrowArguments(); 535*795d594fSAndroid Build Coastguard Worker assertNotReached(); 536*795d594fSAndroid Build Coastguard Worker } catch (BootstrapMethodError expected) { 537*795d594fSAndroid Build Coastguard Worker assertEquals(ClassCastException.class, expected.getCause().getClass()); 538*795d594fSAndroid Build Coastguard Worker System.out.print("invokeNarrowArguments => "); 539*795d594fSAndroid Build Coastguard Worker System.out.print(expected.getClass()); 540*795d594fSAndroid Build Coastguard Worker System.out.print(" => "); 541*795d594fSAndroid Build Coastguard Worker System.out.println(expected.getCause().getClass()); 542*795d594fSAndroid Build Coastguard Worker } 543*795d594fSAndroid Build Coastguard Worker invokeWideningArguments(); 544*795d594fSAndroid Build Coastguard Worker invokeBoxingArguments(); 545*795d594fSAndroid Build Coastguard Worker try { 546*795d594fSAndroid Build Coastguard Worker invokeWideningBoxingArguments(); 547*795d594fSAndroid Build Coastguard Worker assertNotReached(); 548*795d594fSAndroid Build Coastguard Worker } catch (BootstrapMethodError expected) { 549*795d594fSAndroid Build Coastguard Worker System.out.print("invokeWideningBoxingArguments => "); 550*795d594fSAndroid Build Coastguard Worker System.out.print(expected.getClass()); 551*795d594fSAndroid Build Coastguard Worker System.out.print(" => "); 552*795d594fSAndroid Build Coastguard Worker System.out.println(expected.getCause().getClass()); 553*795d594fSAndroid Build Coastguard Worker } 554*795d594fSAndroid Build Coastguard Worker try { 555*795d594fSAndroid Build Coastguard Worker invokeVoidReturnType(); 556*795d594fSAndroid Build Coastguard Worker assertNotReached(); 557*795d594fSAndroid Build Coastguard Worker } catch (BootstrapMethodError expected) { 558*795d594fSAndroid Build Coastguard Worker System.out.print("invokeVoidReturnType() => "); 559*795d594fSAndroid Build Coastguard Worker System.out.print(expected.getClass()); 560*795d594fSAndroid Build Coastguard Worker System.out.print(" => "); 561*795d594fSAndroid Build Coastguard Worker System.out.println(expected.getCause().getClass()); 562*795d594fSAndroid Build Coastguard Worker } 563*795d594fSAndroid Build Coastguard Worker try { 564*795d594fSAndroid Build Coastguard Worker invokeObjectReturnType(); 565*795d594fSAndroid Build Coastguard Worker assertNotReached(); 566*795d594fSAndroid Build Coastguard Worker } catch (BootstrapMethodError expected) { 567*795d594fSAndroid Build Coastguard Worker System.out.print("invokeObjectReturnType() => "); 568*795d594fSAndroid Build Coastguard Worker System.out.print(expected.getClass()); 569*795d594fSAndroid Build Coastguard Worker System.out.print(" => "); 570*795d594fSAndroid Build Coastguard Worker System.out.println(expected.getCause().getClass()); 571*795d594fSAndroid Build Coastguard Worker } 572*795d594fSAndroid Build Coastguard Worker try { 573*795d594fSAndroid Build Coastguard Worker invokeIntegerReturnType(); 574*795d594fSAndroid Build Coastguard Worker assertNotReached(); 575*795d594fSAndroid Build Coastguard Worker } catch (BootstrapMethodError expected) { 576*795d594fSAndroid Build Coastguard Worker System.out.print("invokeIntegerReturnType() => "); 577*795d594fSAndroid Build Coastguard Worker System.out.print(expected.getClass()); 578*795d594fSAndroid Build Coastguard Worker System.out.print(" => "); 579*795d594fSAndroid Build Coastguard Worker System.out.println(expected.getCause().getClass()); 580*795d594fSAndroid Build Coastguard Worker } 581*795d594fSAndroid Build Coastguard Worker invokeViaCustomCallSiteClass(); 582*795d594fSAndroid Build Coastguard Worker } 583*795d594fSAndroid Build Coastguard Worker } 584