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 jdk.internal.misc.SharedSecrets;
  32 import jdk.internal.org.objectweb.asm.Opcodes;
  33 import jdk.internal.reflect.ConstantPool;
  34 import jdk.internal.reflect.ConstantPool.Tag;
  35 import jdk.vm.ci.meta.MetaAccessProvider;
  36 import jdk.vm.ci.meta.ResolvedJavaMethod;
  37 import jdk.vm.ci.meta.ResolvedJavaType;
  38 import jdk.vm.ci.runtime.JVMCI;
  39 import sun.hotspot.WhiteBox;
  40 
  41 import java.util.HashMap;
  42 import java.util.Map;
  43 
  44 import static compiler.jvmci.compilerToVM.ConstantPoolTestCase.ConstantTypes.CONSTANT_CLASS;
  45 import static compiler.jvmci.compilerToVM.ConstantPoolTestCase.ConstantTypes.CONSTANT_FIELDREF;
  46 import static compiler.jvmci.compilerToVM.ConstantPoolTestCase.ConstantTypes.CONSTANT_INTERFACEMETHODREF;
  47 import static compiler.jvmci.compilerToVM.ConstantPoolTestCase.ConstantTypes.CONSTANT_INVOKEDYNAMIC;
  48 import static compiler.jvmci.compilerToVM.ConstantPoolTestCase.ConstantTypes.CONSTANT_METHODHANDLE;
  49 import static compiler.jvmci.compilerToVM.ConstantPoolTestCase.ConstantTypes.CONSTANT_METHODREF;
  50 import static compiler.jvmci.compilerToVM.ConstantPoolTestCase.ConstantTypes.CONSTANT_METHODTYPE;
  51 import static compiler.jvmci.compilerToVM.ConstantPoolTestCase.ConstantTypes.CONSTANT_STRING;
  52 
  53 /**
  54  * Class contains hard-coded constant pool tables for dummy classes used for
  55  * jdk.vm.ci.hotspot.CompilerToVM constant pool methods
  56  */
  57 public class ConstantPoolTestsHelper {
  58 
  59     public static final int NO_CP_CACHE_PRESENT = Integer.MAX_VALUE;
  60     private static final MetaAccessProvider metaAccess = JVMCI.getRuntime().getHostJVMCIBackend().getMetaAccess();
  61 
  62     public enum DummyClasses {
  63         DUMMY_CLASS(MultipleImplementer2.class, CP_MAP_FOR_CLASS),
  64         DUMMY_ABS_CLASS(MultipleAbstractImplementer.class, CP_MAP_FOR_ABS_CLASS),
  65         DUMMY_INTERFACE(MultipleImplementersInterface.class, CP_MAP_FOR_INTERFACE);
  66 
  67         private static final WhiteBox WB = WhiteBox.getWhiteBox();
  68         public final Class<?> klass;
  69         public final ConstantPool constantPoolSS;
  70         public final Map<ConstantTypes, TestedCPEntry[]> testedCP;
  71 
  72         DummyClasses(Class<?> klass, Map<ConstantTypes, TestedCPEntry[]> testedCP) {
  73             this.klass = klass;
  74             this.constantPoolSS = SharedSecrets.getJavaLangAccess().getConstantPool(klass);
  75             this.testedCP = testedCP;
  76         }
  77 
  78         public int getCPCacheIndex(int cpi) {
  79             int cacheLength = WB.getConstantPoolCacheLength(this.klass);
  80             int indexTag = WB.getConstantPoolCacheIndexTag();
  81             for (int cpci = indexTag; cpci < cacheLength + indexTag; cpci++) {
  82                 if (WB.remapInstructionOperandFromCPCache(this.klass, cpci) == cpi) {
  83                     if (constantPoolSS.getTagAt(cpi).equals(Tag.INVOKEDYNAMIC)) {
  84                         return WB.encodeConstantPoolIndyIndex(cpci) + indexTag;
  85                     }
  86                     return cpci;
  87                 }
  88             }
  89             return NO_CP_CACHE_PRESENT;
  90         }
  91     }
  92 
  93     /**
  94      * Obtain a resolved Java method declared by a given type.
  95      *
  96      * @param type the declaring type
  97      * @param the method's name
  98      *
  99      * Currently, the lookup is based only on the method's name
 100      * but not on the method's signature (i.e., the first method
 101      * with a matching name declared on {@code type} is returned).
 102      */
 103     private static ResolvedJavaMethod getMethod(ResolvedJavaType type, String methodName) {
 104         if (methodName.equals("<clinit>")) {
 105             return type.getClassInitializer();
 106         }
 107 
 108         if (methodName.equals("<init>")) {
 109             ResolvedJavaMethod[] initializers = type.getDeclaredConstructors();
 110             if (initializers.length >= 0) {
 111                 return initializers[0];
 112             } else {
 113                 throw new IllegalArgumentException();
 114             }
 115         }
 116 
 117         for (ResolvedJavaMethod method : type.getDeclaredMethods()) {
 118             if (method.getName().equals(methodName)) {
 119                 return method;
 120             }
 121         }
 122 
 123         throw new IllegalArgumentException();
 124     }
 125 
 126     private static ResolvedJavaType getType(Class<?> clazz) {
 127         ResolvedJavaType type = metaAccess.lookupJavaType(clazz);
 128         type.initialize();
 129         return type;
 130     }
 131 
 132     private static final Map<ConstantTypes, TestedCPEntry[]> CP_MAP_FOR_CLASS = new HashMap<>();
 133     static {
 134         CP_MAP_FOR_CLASS.put(CONSTANT_CLASS,
 135                 new TestedCPEntry[] {
 136                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementersInterface", null, null),
 137                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2", null, null),
 138                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2$1", null, null),
 139                     new TestedCPEntry("java/lang/invoke/MethodHandles$Lookup", null, null),
 140                 }
 141         );
 142         CP_MAP_FOR_CLASS.put(CONSTANT_FIELDREF,
 143                 new TestedCPEntry[] {
 144                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2",
 145                                       "intStaticField",
 146                                       "I",
 147                                       new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC},
 148                                       Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC),
 149                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2",
 150                                       "longStaticField",
 151                                       "J",
 152                                       new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC},
 153                                       Opcodes.ACC_FINAL | Opcodes.ACC_STATIC),
 154                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2",
 155                                       "floatStaticField",
 156                                       "F",
 157                                       new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC},
 158                                       Opcodes.ACC_VOLATILE | Opcodes.ACC_STATIC),
 159                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2",
 160                                       "doubleStaticField",
 161                                       "D",
 162                                       new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC},
 163                                       Opcodes.ACC_STATIC),
 164                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2",
 165                                       "stringStaticField",
 166                                       "Ljava/lang/String;",
 167                                       new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC},
 168                                       Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC),
 169                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2",
 170                                       "objectStaticField",
 171                                       "Ljava/lang/Object;",
 172                                       new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC},
 173                                       Opcodes.ACC_PROTECTED | Opcodes.ACC_STATIC),
 174                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2",
 175                                       "intField",
 176                                       "I",
 177                                       new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD},
 178                                       Opcodes.ACC_PUBLIC),
 179                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2",
 180                                       "longField",
 181                                       "J",
 182                                       new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD},
 183                                       Opcodes.ACC_PRIVATE),
 184                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2",
 185                                       "floatField",
 186                                       "F",
 187                                       new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD},
 188                                       Opcodes.ACC_PROTECTED),
 189                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2",
 190                                       "doubleField",
 191                                       "D",
 192                                       new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD},
 193                                       Opcodes.ACC_TRANSIENT),
 194                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2",
 195                                       "objectField",
 196                                       "Ljava/lang/Object;",
 197                                       new ResolvedJavaMethod[] { getMethod(getType(MultipleImplementer2.class), "<init>"), null },
 198                                       new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD},
 199                                       Opcodes.ACC_FINAL),
 200                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2",
 201                                       "stringField",
 202                                       "Ljava/lang/String;",
 203                                       new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD},
 204                                       Opcodes.ACC_VOLATILE),
 205                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2",
 206                                       "stringFieldEmpty",
 207                                       "Ljava/lang/String;",
 208                                       new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD},
 209                                       0L),
 210                 }
 211         );
 212         CP_MAP_FOR_CLASS.put(CONSTANT_METHODREF,
 213                 new TestedCPEntry[] {
 214                     new TestedCPEntry("java/lang/System",
 215                                       "getProperties",
 216                                       "()Ljava/util/Properties;",
 217                                       new byte[] {(byte) Opcodes.INVOKESTATIC}),
 218                     new TestedCPEntry("java/util/HashMap",
 219                                       "<init>",
 220                                       "()V",
 221                                       new byte[] {(byte) Opcodes.INVOKESPECIAL}),
 222                     new TestedCPEntry("java/lang/Object",
 223                                       "toString",
 224                                       "()Ljava/lang/String;",
 225                                       new byte[] {(byte) Opcodes.INVOKESPECIAL,
 226                                       (byte) Opcodes.INVOKEVIRTUAL}),
 227                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2$1",
 228                                       "<init>",
 229                                       "(Lcompiler/jvmci/common/testcases/MultipleImplementer2;)V",
 230                                       new byte[0]),
 231                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer$1",
 232                                       "run",
 233                                       "()V",
 234                                       new byte[0]),
 235                 }
 236         );
 237         CP_MAP_FOR_CLASS.put(CONSTANT_INTERFACEMETHODREF,
 238                 new TestedCPEntry[] {
 239                     new TestedCPEntry("java/util/Map",
 240                                       "put",
 241                                       "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
 242                                       new byte[] {(byte) Opcodes.INVOKEINTERFACE}),
 243                     new TestedCPEntry("java/util/Map",
 244                                       "remove",
 245                                       "(Ljava/lang/Object;)Ljava/lang/Object;",
 246                                       new byte[] {(byte) Opcodes.INVOKEINTERFACE}),
 247                 }
 248         );
 249         CP_MAP_FOR_CLASS.put(CONSTANT_STRING,
 250                 new TestedCPEntry[] {
 251                     new TestedCPEntry(null, "Message", null),
 252                     new TestedCPEntry(null, "", null),
 253                 }
 254         );
 255         CP_MAP_FOR_CLASS.put(CONSTANT_METHODHANDLE,
 256                 new TestedCPEntry[] {
 257                     new TestedCPEntry("java/lang/invoke/LambdaMetafactory",
 258                                       "metafactory",
 259                                       "(Ljava/lang/invoke/MethodHandles$Lookup;"
 260                                               + "Ljava/lang/String;"
 261                                               + "Ljava/lang/invoke/MethodType;"
 262                                               + "Ljava/lang/invoke/MethodType;"
 263                                               + "Ljava/lang/invoke/MethodHandle;"
 264                                               + "Ljava/lang/invoke/MethodType;)"
 265                                               + "Ljava/lang/invoke/CallSite;",
 266                                       null),
 267                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementer2",
 268                                       "testMethod",
 269                                       "()V"),
 270                 }
 271         );
 272         CP_MAP_FOR_CLASS.put(CONSTANT_METHODTYPE,
 273                 new TestedCPEntry[] {
 274                     new TestedCPEntry(null, null, "()V"),
 275                 }
 276         );
 277         CP_MAP_FOR_CLASS.put(CONSTANT_INVOKEDYNAMIC,
 278                 new TestedCPEntry[] {
 279                     new TestedCPEntry(null,
 280                                      "run",
 281                                      "(Lcompiler/jvmci/common/testcases/MultipleImplementer2;)"
 282                                              + "Ljava/lang/Runnable;"),
 283                 }
 284         );
 285     }
 286 
 287     private static final Map<ConstantTypes, TestedCPEntry[]> CP_MAP_FOR_ABS_CLASS
 288             = new HashMap<>();
 289     static {
 290         CP_MAP_FOR_ABS_CLASS.put(CONSTANT_CLASS,
 291                 new TestedCPEntry[] {
 292                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementersInterface", null, null),
 293                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer", null, null),
 294                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer$1", null, null),
 295                     new TestedCPEntry("java/lang/invoke/MethodHandles$Lookup", null, null),
 296                 }
 297         );
 298         CP_MAP_FOR_ABS_CLASS.put(CONSTANT_FIELDREF,
 299                 new TestedCPEntry[] {
 300                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer",
 301                                       "intStaticField",
 302                                       "I",
 303                                       new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC},
 304                                       Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC),
 305                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer",
 306                                       "longStaticField",
 307                                       "J",
 308                                       new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC},
 309                                       Opcodes.ACC_FINAL | Opcodes.ACC_STATIC),
 310                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer",
 311                                       "floatStaticField",
 312                                       "F",
 313                                       new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC},
 314                                       Opcodes.ACC_VOLATILE | Opcodes.ACC_STATIC),
 315                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer",
 316                                       "doubleStaticField",
 317                                       "D",
 318                                       new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC},
 319                                       Opcodes.ACC_STATIC),
 320                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer",
 321                                       "stringStaticField",
 322                                       "Ljava/lang/String;",
 323                                       new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC},
 324                                       Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC),
 325                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer",
 326                                       "objectStaticField",
 327                                       "Ljava/lang/Object;",
 328                                       new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC},
 329                                       Opcodes.ACC_PROTECTED | Opcodes.ACC_STATIC),
 330                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer",
 331                                       "intField",
 332                                       "I",
 333                                       new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD},
 334                                       Opcodes.ACC_PUBLIC),
 335                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer",
 336                                       "longField",
 337                                       "J",
 338                                       new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD},
 339                                       Opcodes.ACC_PRIVATE),
 340                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer",
 341                                       "floatField",
 342                                       "F",
 343                                       new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD},
 344                                       Opcodes.ACC_PROTECTED),
 345                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer",
 346                                       "doubleField",
 347                                       "D",
 348                                       new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD},
 349                                       Opcodes.ACC_TRANSIENT),
 350                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer",
 351                                       "objectField",
 352                                       "Ljava/lang/Object;",
 353                                       new ResolvedJavaMethod[] { getMethod(getType(MultipleAbstractImplementer.class), "<init>"), null },
 354                                       new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD},
 355                                       Opcodes.ACC_FINAL),
 356                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer",
 357                                       "stringField",
 358                                       "Ljava/lang/String;",
 359                                       new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD},
 360                                       Opcodes.ACC_VOLATILE),
 361                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer",
 362                                       "stringFieldEmpty",
 363                                       "Ljava/lang/String;",
 364                                       new byte[] {(byte) Opcodes.PUTFIELD | (byte) Opcodes.GETFIELD},
 365                                       0L),
 366                 }
 367         );
 368         CP_MAP_FOR_ABS_CLASS.put(CONSTANT_METHODREF,
 369                 new TestedCPEntry[] {
 370                     new TestedCPEntry("java/lang/System",
 371                                       "getProperties",
 372                                       "()Ljava/util/Properties;",
 373                                       new byte[] {(byte) Opcodes.INVOKESTATIC}),
 374                     new TestedCPEntry("java/util/HashMap",
 375                                       "<init>",
 376                                       "()V",
 377                                       new byte[] {(byte) Opcodes.INVOKESPECIAL}),
 378                     new TestedCPEntry("java/lang/Object",
 379                                       "toString",
 380                                       "()Ljava/lang/String;",
 381                                       new byte[] {(byte) Opcodes.INVOKESPECIAL,
 382                                       (byte) Opcodes.INVOKEVIRTUAL}),
 383                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer$1",
 384                                       "<init>",
 385                                       "(Lcompiler/jvmci/common/testcases/MultipleAbstractImplementer;)V",
 386                                       new byte[0]),
 387                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer$1",
 388                                       "run",
 389                                       "()V",
 390                                       new byte[0]),
 391                 }
 392         );
 393         CP_MAP_FOR_ABS_CLASS.put(CONSTANT_INTERFACEMETHODREF,
 394                 new TestedCPEntry[] {
 395                     new TestedCPEntry("java/util/Map",
 396                                       "put",
 397                                       "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
 398                                       new byte[] {(byte) Opcodes.INVOKEINTERFACE}),
 399                     new TestedCPEntry("java/util/Map",
 400                                       "remove",
 401                                       "(Ljava/lang/Object;)Ljava/lang/Object;",
 402                                       new byte[] {(byte) Opcodes.INVOKEINTERFACE}),
 403                 }
 404         );
 405         CP_MAP_FOR_ABS_CLASS.put(CONSTANT_STRING,
 406                 new TestedCPEntry[] {
 407                     new TestedCPEntry(null, "Message", null),
 408                     new TestedCPEntry(null, "", null),
 409                 }
 410         );
 411         CP_MAP_FOR_ABS_CLASS.put(CONSTANT_METHODHANDLE,
 412                 new TestedCPEntry[] {
 413                     new TestedCPEntry("java/lang/invoke/LambdaMetafactory",
 414                                       "metafactory",
 415                                       "(Ljava/lang/invoke/MethodHandles$Lookup;"
 416                                               + "Ljava/lang/String;"
 417                                               + "Ljava/lang/invoke/MethodType;"
 418                                               + "Ljava/lang/invoke/MethodType;"
 419                                               + "Ljava/lang/invoke/MethodHandle;"
 420                                               + "Ljava/lang/invoke/MethodType;)"
 421                                               + "Ljava/lang/invoke/CallSite;",
 422                                       null),
 423                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer",
 424                                       "testMethod",
 425                                       "()V"),
 426                 }
 427         );
 428         CP_MAP_FOR_ABS_CLASS.put(CONSTANT_METHODTYPE,
 429                 new TestedCPEntry[] {
 430                     new TestedCPEntry(null, null, "()V"),
 431                 }
 432         );
 433         CP_MAP_FOR_ABS_CLASS.put(CONSTANT_INVOKEDYNAMIC,
 434                 new TestedCPEntry[] {
 435                     new TestedCPEntry(null,
 436                                       "run",
 437                                       "(Lcompiler/jvmci/common/testcases/MultipleAbstractImplementer;)"
 438                                               + "Ljava/lang/Runnable;"),
 439                 }
 440         );
 441     }
 442 
 443     private static final Map<ConstantTypes, TestedCPEntry[]> CP_MAP_FOR_INTERFACE
 444             = new HashMap<>();
 445     static {
 446         CP_MAP_FOR_INTERFACE.put(CONSTANT_CLASS,
 447                 new TestedCPEntry[] {
 448                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementersInterface", null, null),
 449                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementersInterface$1", null, null),
 450                     new TestedCPEntry("java/lang/Object", null, null),
 451                     new TestedCPEntry("java/lang/invoke/MethodHandles$Lookup", null, null),
 452                 }
 453         );
 454         CP_MAP_FOR_INTERFACE.put(CONSTANT_FIELDREF,
 455                 new TestedCPEntry[] {
 456                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementersInterface",
 457                                       "OBJECT_CONSTANT",
 458                                       "Ljava/lang/Object;",
 459                                       new ResolvedJavaMethod[] { getMethod(getType(MultipleImplementersInterface.class), "<clinit>"), null },
 460                                       new byte[] {(byte) Opcodes.PUTSTATIC, (byte) Opcodes.GETSTATIC},
 461                                       Opcodes.ACC_STATIC | Opcodes.ACC_FINAL | Opcodes.ACC_PUBLIC),
 462                 }
 463         );
 464         CP_MAP_FOR_INTERFACE.put(CONSTANT_METHODREF,
 465                 new TestedCPEntry[] {
 466                     new TestedCPEntry("java/lang/System",
 467                                       "getProperties",
 468                                       "()Ljava/util/Properties;",
 469                                       new byte[] {(byte) Opcodes.INVOKESTATIC}),
 470                     new TestedCPEntry("java/util/HashMap",
 471                                       "<init>",
 472                                       "()V",
 473                                       new byte[] {(byte) Opcodes.INVOKESPECIAL}),
 474                     new TestedCPEntry("java/lang/Object",
 475                                       "toString",
 476                                       "()Ljava/lang/String;",
 477                                       new byte[] {(byte) Opcodes.INVOKEVIRTUAL}),
 478                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer$1",
 479                                       "<init>",
 480                                       "(Lcompiler/jvmci/common/testcases/MultipleAbstractImplementer;)V",
 481                                       new byte[0]),
 482                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleAbstractImplementer$1",
 483                                       "run",
 484                                       "()V",
 485                                       new byte[0]),
 486                 }
 487         );
 488         CP_MAP_FOR_INTERFACE.put(CONSTANT_INTERFACEMETHODREF,
 489                 new TestedCPEntry[] {
 490                     new TestedCPEntry("java/util/Map",
 491                                       "put",
 492                                       "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;",
 493                                       new byte[] {(byte) Opcodes.INVOKEINTERFACE}),
 494                     new TestedCPEntry("java/util/Map",
 495                                       "remove",
 496                                       "(Ljava/lang/Object;)Ljava/lang/Object;",
 497                                       new byte[] {(byte) Opcodes.INVOKEINTERFACE}),
 498                 }
 499         );
 500         CP_MAP_FOR_INTERFACE.put(CONSTANT_STRING,
 501                 new TestedCPEntry[] {
 502                     new TestedCPEntry(null, "Hello", null),
 503                     new TestedCPEntry(null, "", null),
 504                 }
 505         );
 506         CP_MAP_FOR_INTERFACE.put(CONSTANT_METHODHANDLE,
 507                 new TestedCPEntry[] {
 508                     new TestedCPEntry("java/lang/invoke/LambdaMetafactory",
 509                                       "metafactory",
 510                                       "(Ljava/lang/invoke/MethodHandles$Lookup;"
 511                                               + "Ljava/lang/String;Ljava/lang/invoke/MethodType;"
 512                                               + "Ljava/lang/invoke/MethodType;"
 513                                               + "Ljava/lang/invoke/MethodHandle;"
 514                                               + "Ljava/lang/invoke/MethodType;)"
 515                                               + "Ljava/lang/invoke/CallSite;"),
 516                     new TestedCPEntry("compiler/jvmci/common/testcases/MultipleImplementersInterface",
 517                                       "defaultMethod",
 518                                       "()V"),
 519                 }
 520         );
 521         CP_MAP_FOR_INTERFACE.put(CONSTANT_METHODTYPE,
 522                 new TestedCPEntry[] {
 523                     new TestedCPEntry(null, null, "()V"),
 524                 }
 525         );
 526         CP_MAP_FOR_INTERFACE.put(CONSTANT_INVOKEDYNAMIC,
 527                 new TestedCPEntry[] {
 528                     new TestedCPEntry(null,
 529                                       "run",
 530                                       "(Lcompiler/jvmci/common/testcases/MultipleImplementersInterface;)"
 531                                               + "Ljava/lang/Runnable;"),
 532                 }
 533         );
 534     }
 535 }