1 /* 2 * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 package compiler.jvmci.compilerToVM; 25 26 import compiler.jvmci.common.testcases.MultipleAbstractImplementer; 27 import compiler.jvmci.common.testcases.MultipleImplementer2; 28 import compiler.jvmci.common.testcases.MultipleImplementersInterface; 29 import compiler.jvmci.compilerToVM.ConstantPoolTestCase.ConstantTypes; 30 import compiler.jvmci.compilerToVM.ConstantPoolTestCase.TestedCPEntry; 31 import java.util.HashMap; 32 import java.util.Map; 33 import jdk.internal.misc.SharedSecrets; 34 import jdk.internal.org.objectweb.asm.Opcodes; 35 import sun.hotspot.WhiteBox; 36 import sun.reflect.ConstantPool; 37 38 /** 39 * Class contains hard-coded constant pool tables for dummy classes used for 40 * jdk.vm.ci.hotspot.CompilerToVM constant pool methods 41 */ 42 public class ConstantPoolTestsHelper { 43 44 public static final int NO_CP_CACHE_PRESENT = Integer.MAX_VALUE; 45 46 public enum DummyClasses { 47 DUMMY_CLASS(MultipleImplementer2.class, CP_MAP_FOR_CLASS), 48 DUMMY_ABS_CLASS(MultipleAbstractImplementer.class, CP_MAP_FOR_ABS_CLASS), 49 DUMMY_INTERFACE(MultipleImplementersInterface.class, CP_MAP_FOR_INTERFACE); 50 51 private static final WhiteBox WB = WhiteBox.getWhiteBox(); 52 public final Class<?> klass; 53 public final ConstantPool constantPoolSS; 54 public final Map<ConstantTypes, TestedCPEntry[]> testedCP; 55 56 DummyClasses(Class<?> klass, Map<ConstantTypes, TestedCPEntry[]> testedCP) { 57 this.klass = klass; 58 this.constantPoolSS = SharedSecrets.getJavaLangAccess(). 59 getConstantPool(klass); 60 this.testedCP = testedCP; 61 } 62 63 public int getCPCacheIndex(int cpi) { 64 int cacheLength = WB.getConstantPoolCacheLength(this.klass); 65 int indexTag = WB.getConstantPoolCacheIndexTag(); 66 for (int cpci = indexTag; cpci < cacheLength + indexTag; cpci++) { 67 if (WB.remapInstructionOperandFromCPCache(this.klass, cpci) == cpi) { 68 if (constantPoolSS.getTagAt(cpi).equals(ConstantPool.Tag.INVOKEDYNAMIC)) { 69 return WB.encodeConstantPoolIndyIndex(cpci) + indexTag; 70 } 71 return cpci; 72 } 73 } 74 return NO_CP_CACHE_PRESENT; 75 } 76 } 77 78 private static final Map<ConstantTypes, TestedCPEntry[]> CP_MAP_FOR_CLASS 79 = new HashMap<>(); 80 static { 81 CP_MAP_FOR_CLASS.put(ConstantTypes.CONSTANT_CLASS, 82 new TestedCPEntry[] { 83 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementersInterface", null, null), 84 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2", null, null), 85 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2$1", null, null), 86 new TestedCPEntry("java/lang/invoke/MethodHandles$Lookup", null, null), 87 } 88 ); 89 CP_MAP_FOR_CLASS.put(ConstantTypes.CONSTANT_FIELDREF, 90 new TestedCPEntry[] { 91 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2", 92 "intStaticField", "I", 93 new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC}, 94 Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC), 95 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2", 96 "longStaticField", "J", 97 new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC}, 98 Opcodes.ACC_FINAL | Opcodes.ACC_STATIC), 99 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2", 100 "floatStaticField", "F", 101 new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC}, 102 Opcodes.ACC_VOLATILE | Opcodes.ACC_STATIC), 103 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2", 104 "doubleStaticField", "D", 105 new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC}, 106 Opcodes.ACC_STATIC), 107 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2", 108 "stringStaticField", "Ljava/lang/String;", 109 new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC}, 110 Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC), 111 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2", 112 "objectStaticField", "Ljava/lang/Object;", 113 new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC}, 114 Opcodes.ACC_PROTECTED | Opcodes.ACC_STATIC), 115 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2", 116 "intField", "I", 117 new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD}, 118 Opcodes.ACC_PUBLIC), 119 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2", 120 "longField", "J", 121 new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD}, 122 Opcodes.ACC_PRIVATE), 123 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2", 124 "floatField", "F", 125 new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD}, 126 Opcodes.ACC_PROTECTED), 127 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2", 128 "doubleField", "D", 129 new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD}, 130 Opcodes.ACC_TRANSIENT), 131 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2", 132 "objectField", "Ljava/lang/Object;", 133 new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD}, 134 Opcodes.ACC_FINAL), 135 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2", 136 "stringField", "Ljava/lang/String;", 137 new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD}, 138 Opcodes.ACC_VOLATILE), 139 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2", 140 "stringFieldEmpty", "Ljava/lang/String;", 141 new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD}, 142 0L), 143 } 144 ); 145 CP_MAP_FOR_CLASS.put(ConstantTypes.CONSTANT_METHODREF, 146 new TestedCPEntry[] { 147 new TestedCPEntry("java/lang/System", 148 "getProperties", "()Ljava/util/Properties;", 149 new byte[] {(byte) Opcodes.INVOKESTATIC}), 150 new TestedCPEntry("java/util/HashMap", 151 "<init>", "()V", 152 new byte[] {(byte) Opcodes.INVOKESPECIAL}), 153 new TestedCPEntry("java/lang/Object", 154 "toString", "()Ljava/lang/String;", 155 new byte[] {(byte) Opcodes.INVOKESPECIAL, 156 (byte) Opcodes.INVOKEVIRTUAL}), 157 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2$1", 158 "<init>", "(Lcompiler/jvmci/common/testcases/MultipleImplementer2;)V", 159 new byte[0]), 160 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer$1", 161 "run", "()V", 162 new byte[0]), 163 } 164 ); 165 CP_MAP_FOR_CLASS.put(ConstantTypes.CONSTANT_INTERFACEMETHODREF, 166 new TestedCPEntry[] { 167 new TestedCPEntry("java/util/Map", 168 "put", 169 "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", 170 new byte[] {(byte) Opcodes.INVOKEINTERFACE}), 171 new TestedCPEntry("java/util/Map", 172 "remove", 173 "(Ljava/lang/Object;)Ljava/lang/Object;", 174 new byte[] {(byte) Opcodes.INVOKEINTERFACE}), 175 } 176 ); 177 CP_MAP_FOR_CLASS.put(ConstantTypes.CONSTANT_STRING, 178 new TestedCPEntry[] { 179 new TestedCPEntry(null, "Message", null), 180 new TestedCPEntry(null, "", null), 181 } 182 ); 183 CP_MAP_FOR_CLASS.put(ConstantTypes.CONSTANT_METHODHANDLE, 184 new TestedCPEntry[] { 185 new TestedCPEntry("java/lang/invoke/LambdaMetafactory", 186 "metafactory", 187 "(Ljava/lang/invoke/MethodHandles$Lookup;" 188 + "Ljava/lang/String;" 189 + "Ljava/lang/invoke/MethodType;" 190 + "Ljava/lang/invoke/MethodType;" 191 + "Ljava/lang/invoke/MethodHandle;" 192 + "Ljava/lang/invoke/MethodType;)" 193 + "Ljava/lang/invoke/CallSite;", null), 194 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2", 195 "testMethod", "()V"), 196 } 197 ); 198 CP_MAP_FOR_CLASS.put(ConstantTypes.CONSTANT_METHODTYPE, 199 new TestedCPEntry[] { 200 new TestedCPEntry(null, null, "()V"), 201 } 202 ); 203 CP_MAP_FOR_CLASS.put(ConstantTypes.CONSTANT_INVOKEDYNAMIC, 204 new TestedCPEntry[] { 205 new TestedCPEntry(null, "run", 206 "(Lcompiler/jvmci/common/testcases/MultipleImplementer2;)" 207 + "Ljava/lang/Runnable;"), 208 } 209 ); 210 } 211 212 private static final Map<ConstantTypes, TestedCPEntry[]> CP_MAP_FOR_ABS_CLASS 213 = new HashMap<>(); 214 static { 215 CP_MAP_FOR_ABS_CLASS.put(ConstantTypes.CONSTANT_CLASS, 216 new TestedCPEntry[] { 217 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementersInterface", null, null), 218 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer", null, null), 219 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer$1", null, null), 220 new TestedCPEntry("java/lang/invoke/MethodHandles$Lookup", null, null), 221 } 222 ); 223 CP_MAP_FOR_ABS_CLASS.put(ConstantTypes.CONSTANT_FIELDREF, 224 new TestedCPEntry[] { 225 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer", 226 "intStaticField", "I", 227 new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC}, 228 Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC), 229 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer", 230 "longStaticField", "J", 231 new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC}, 232 Opcodes.ACC_FINAL | Opcodes.ACC_STATIC), 233 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer", 234 "floatStaticField", "F", 235 new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC}, 236 Opcodes.ACC_VOLATILE | Opcodes.ACC_STATIC), 237 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer", 238 "doubleStaticField", "D", 239 new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC}, 240 Opcodes.ACC_STATIC), 241 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer", 242 "stringStaticField", "Ljava/lang/String;", 243 new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC}, 244 Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC), 245 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer", 246 "objectStaticField", "Ljava/lang/Object;", 247 new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC}, 248 Opcodes.ACC_PROTECTED | Opcodes.ACC_STATIC), 249 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer", 250 "intField", "I", 251 new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD}, 252 Opcodes.ACC_PUBLIC), 253 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer", 254 "longField", "J", 255 new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD}, 256 Opcodes.ACC_PRIVATE), 257 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer", 258 "floatField", "F", 259 new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD}, 260 Opcodes.ACC_PROTECTED), 261 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer", 262 "doubleField", "D", 263 new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD}, 264 Opcodes.ACC_TRANSIENT), 265 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer", 266 "objectField", "Ljava/lang/Object;", 267 new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD}, 268 Opcodes.ACC_FINAL), 269 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer", 270 "stringField", "Ljava/lang/String;", 271 new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD}, 272 Opcodes.ACC_VOLATILE), 273 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer", 274 "stringFieldEmpty", "Ljava/lang/String;", 275 new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD}, 276 0L), 277 } 278 ); 279 CP_MAP_FOR_ABS_CLASS.put(ConstantTypes.CONSTANT_METHODREF, 280 new TestedCPEntry[] { 281 new TestedCPEntry("java/lang/System", 282 "getProperties", "()Ljava/util/Properties;", 283 new byte[] {(byte) Opcodes.INVOKESTATIC}), 284 new TestedCPEntry("java/util/HashMap", 285 "<init>", "()V", 286 new byte[] {(byte) Opcodes.INVOKESPECIAL}), 287 new TestedCPEntry("java/lang/Object", 288 "toString", "()Ljava/lang/String;", 289 new byte[] {(byte) Opcodes.INVOKESPECIAL, 290 (byte) Opcodes.INVOKEVIRTUAL}), 291 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer$1", 292 "<init>", "(Lcompiler/jvmci/common/testcases/MultipleAbstractImplementer;)V", 293 new byte[0]), 294 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer$1", 295 "run", "()V", 296 new byte[0]), 297 } 298 ); 299 CP_MAP_FOR_ABS_CLASS.put(ConstantTypes.CONSTANT_INTERFACEMETHODREF, 300 new TestedCPEntry[] { 301 new TestedCPEntry("java/util/Map", 302 "put", 303 "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", 304 new byte[] {(byte) Opcodes.INVOKEINTERFACE}), 305 new TestedCPEntry("java/util/Map", 306 "remove", 307 "(Ljava/lang/Object;)Ljava/lang/Object;", 308 new byte[] {(byte) Opcodes.INVOKEINTERFACE}), 309 } 310 ); 311 CP_MAP_FOR_ABS_CLASS.put(ConstantTypes.CONSTANT_STRING, 312 new TestedCPEntry[] { 313 new TestedCPEntry(null, "Message", null), 314 new TestedCPEntry(null, "", null), 315 } 316 ); 317 CP_MAP_FOR_ABS_CLASS.put(ConstantTypes.CONSTANT_METHODHANDLE, 318 new TestedCPEntry[] { 319 new TestedCPEntry("java/lang/invoke/LambdaMetafactory", 320 "metafactory", 321 "(Ljava/lang/invoke/MethodHandles$Lookup;" 322 + "Ljava/lang/String;" 323 + "Ljava/lang/invoke/MethodType;" 324 + "Ljava/lang/invoke/MethodType;" 325 + "Ljava/lang/invoke/MethodHandle;" 326 + "Ljava/lang/invoke/MethodType;)" 327 + "Ljava/lang/invoke/CallSite;", null), 328 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer", 329 "testMethod", "()V"), 330 } 331 ); 332 CP_MAP_FOR_ABS_CLASS.put(ConstantTypes.CONSTANT_METHODTYPE, 333 new TestedCPEntry[] { 334 new TestedCPEntry(null, null, "()V"), 335 } 336 ); 337 CP_MAP_FOR_ABS_CLASS.put(ConstantTypes.CONSTANT_INVOKEDYNAMIC, 338 new TestedCPEntry[] { 339 new TestedCPEntry(null, "run", 340 "(Lcompiler/jvmci/common/testcases/MultipleAbstractImplementer;)" 341 + "Ljava/lang/Runnable;"), 342 } 343 ); 344 } 345 346 private static final Map<ConstantTypes, TestedCPEntry[]> CP_MAP_FOR_INTERFACE 347 = new HashMap<>(); 348 static { 349 CP_MAP_FOR_INTERFACE.put(ConstantTypes.CONSTANT_CLASS, 350 new TestedCPEntry[] { 351 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementersInterface", null, null), 352 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementersInterface$1", null, null), 353 new TestedCPEntry("java/lang/Object", null, null), 354 new TestedCPEntry("java/lang/invoke/MethodHandles$Lookup", null, null), 355 } 356 ); 357 CP_MAP_FOR_INTERFACE.put(ConstantTypes.CONSTANT_FIELDREF, 358 new TestedCPEntry[] { 359 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementersInterface", 360 "OBJECT_CONSTANT", "Ljava/lang/Object;", 361 new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC}, 362 Opcodes.ACC_STATIC | Opcodes.ACC_FINAL | Opcodes.ACC_PUBLIC), 363 } 364 ); 365 CP_MAP_FOR_INTERFACE.put(ConstantTypes.CONSTANT_METHODREF, 366 new TestedCPEntry[] { 367 new TestedCPEntry("java/lang/System", 368 "getProperties", "()Ljava/util/Properties;", 369 new byte[] {(byte) Opcodes.INVOKESTATIC}), 370 new TestedCPEntry("java/util/HashMap", 371 "<init>", "()V", new byte[] {(byte) Opcodes.INVOKESPECIAL}), 372 new TestedCPEntry("java/lang/Object", 373 "toString", "()Ljava/lang/String;", 374 new byte[] {(byte) Opcodes.INVOKEVIRTUAL}), 375 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer$1", 376 "<init>", "(Lcompiler/jvmci/common/testcases/MultipleAbstractImplementer;)V", 377 new byte[0]), 378 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer$1", 379 "run", "()V", 380 new byte[0]), 381 } 382 ); 383 CP_MAP_FOR_INTERFACE.put(ConstantTypes.CONSTANT_INTERFACEMETHODREF, 384 new TestedCPEntry[] { 385 new TestedCPEntry("java/util/Map", 386 "put", 387 "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", 388 new byte[] {(byte) Opcodes.INVOKEINTERFACE}), 389 new TestedCPEntry("java/util/Map", 390 "remove", 391 "(Ljava/lang/Object;)Ljava/lang/Object;", 392 new byte[] {(byte) Opcodes.INVOKEINTERFACE}), 393 } 394 ); 395 CP_MAP_FOR_INTERFACE.put(ConstantTypes.CONSTANT_STRING, 396 new TestedCPEntry[] { 397 new TestedCPEntry(null, "Hello", null), 398 new TestedCPEntry(null, "", null), 399 } 400 ); 401 CP_MAP_FOR_INTERFACE.put(ConstantTypes.CONSTANT_METHODHANDLE, 402 new TestedCPEntry[] { 403 new TestedCPEntry("java/lang/invoke/LambdaMetafactory", 404 "metafactory", 405 "(Ljava/lang/invoke/MethodHandles$Lookup;" 406 + "Ljava/lang/String;Ljava/lang/invoke/MethodType;" 407 + "Ljava/lang/invoke/MethodType;" 408 + "Ljava/lang/invoke/MethodHandle;" 409 + "Ljava/lang/invoke/MethodType;)" 410 + "Ljava/lang/invoke/CallSite;"), 411 new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementersInterface", 412 "defaultMethod", "()V"), 413 } 414 ); 415 CP_MAP_FOR_INTERFACE.put(ConstantTypes.CONSTANT_METHODTYPE, 416 new TestedCPEntry[] { 417 new TestedCPEntry(null, null, "()V"), 418 } 419 ); 420 CP_MAP_FOR_INTERFACE.put(ConstantTypes.CONSTANT_INVOKEDYNAMIC, 421 new TestedCPEntry[] { 422 new TestedCPEntry(null, "run", 423 "(Lcompiler/jvmci/common/testcases/MultipleImplementersInterface;)" 424 + "Ljava/lang/Runnable;"), 425 } 426 ); 427 } 428 }