test/jdk/lib/testlibrary/bytecode/jdk/experimental/bytecode/BytePoolHelper.java
changeset 48827 8772acd913e5
parent 48826 c4d9d1b08e2e
--- a/test/jdk/lib/testlibrary/bytecode/jdk/experimental/bytecode/BytePoolHelper.java	Fri Sep 08 10:46:46 2017 -0700
+++ b/test/jdk/lib/testlibrary/bytecode/jdk/experimental/bytecode/BytePoolHelper.java	Wed Jan 31 11:20:36 2018 -0800
@@ -490,7 +490,8 @@
         BsmKey poolKey = bootstraps.lookup(bsmKey);
         if (poolKey == null) {
             poolKey = bsmKey.dup();
-            int bsm_ref = putHandleInternal(MethodHandleInfo.REF_invokeStatic, bsmClass, bsmName, bsmType);
+            // TODO the BSM could be a static method on an interface
+            int bsm_ref = putHandleInternal(MethodHandleInfo.REF_invokeStatic, bsmClass, bsmName, bsmType, false);
             poolKey.at(currentBsmIndex++);
             bootstraps.enter(poolKey);
             bsm_attr.writeChar(bsm_ref);
@@ -562,15 +563,20 @@
 
     @Override
     public int putHandle(int refKind, S owner, CharSequence name, T type) {
-        return putHandleInternal(refKind, symbolToString.apply(owner), name, typeToString.apply(type));
+        return putHandleInternal(refKind, symbolToString.apply(owner), name, typeToString.apply(type), false);
     }
 
-    private int putHandleInternal(int refKind, String owner, CharSequence name, String type) {
+    @Override
+    public int putHandle(int refKind, S owner, CharSequence name, T type, boolean isInterface) {
+        return putHandleInternal(refKind, symbolToString.apply(owner), name, typeToString.apply(type), isInterface);
+    }
+
+    private int putHandleInternal(int refKind, String owner, CharSequence name, String type, boolean isInterface) {
         key.setMethodHandle(refKind, owner, name, type);
         PoolKey poolKey = entries.lookup(key);
         if (poolKey == null) {
             poolKey = key.dup();
-            int ref_idx = putMemberRefInternal(fromKind(refKind), owner, name, type);
+            int ref_idx = putMemberRefInternal(fromKind(refKind, isInterface), owner, name, type);
             poolKey.at(currentIndex++);
             entries.enter(poolKey);
             pool.writeByte(PoolTag.CONSTANT_METHODHANDLE.tag);
@@ -580,7 +586,7 @@
         return poolKey.index;
     }
 
-    PoolTag fromKind(int bsmKind) {
+    PoolTag fromKind(int bsmKind, boolean isInterface) {
         switch (bsmKind) {
             case 1: // REF_getField
             case 2: // REF_getStatic
@@ -591,9 +597,8 @@
             case 6: // REF_invokeStatic
             case 7: // REF_invokeSpecial
             case 8: // REF_newInvokeSpecial
-                return PoolTag.CONSTANT_METHODREF;
             case 9: // REF_invokeInterface
-                return PoolTag.CONSTANT_INTERFACEMETHODREF;
+                return isInterface ? PoolTag.CONSTANT_INTERFACEMETHODREF : PoolTag.CONSTANT_METHODREF;
             default:
                 throw new IllegalStateException();
         }