Bug in the handling of CONSTANT_METHODHANDLE, CONSTANT_INVOKEDYNAMIC and CONSTANT_CONSTANTDYNAMIC by JDIS.

Maxim Degtyarev mdegtyarev at gmail.com
Wed Nov 8 10:22:59 UTC 2017


JDIS incorrectly assume that CPX2.value1 for CONSTANT_METHODHANDLE,
CONSTANT_INVOKEDYNAMIC and CONSTANT_CONSTANTDYNAMIC holds reference to
the CONSTANT_CLASS constant pool entry.

Following patch address this issue:

diff --git a/src/org/openjdk/asmtools/jdis/ConstantPool.java
b/src/org/openjdk/asmtools/jdis/ConstantPool.java
--- a/src/org/openjdk/asmtools/jdis/ConstantPool.java
+++ b/src/org/openjdk/asmtools/jdis/ConstantPool.java
@@ -601,6 +601,24 @@
         }
     }

+
+    /**
+     *
+     * CPX2_ClassMember
+     *
+     * Specialized class for constant entries that contain two
constant-pool indices referring class or interface member.
+     * Usually, this includes:
+     * CONSTANT_FIELD CONSTANT_METHOD CONSTANT_INTERFACEMETHOD
+     *
+     */
+    class CPX2_ClassMember extends CPX2 {
+
+        CPX2_ClassMember(TAG tagval, int cpx1, int cpx2) {
+            super(tagval, cpx1, cpx2);
+        }
+
+    }
+
     /* -------------------------------------------------------- */
     /* ConstantPool Fields */
     /**
@@ -675,6 +693,8 @@
                 case CONSTANT_FIELD:
                 case CONSTANT_METHOD:
                 case CONSTANT_INTERFACEMETHOD:
+                    pool.add(i, new CPX2_ClassMember(tagobj,
in.readUnsignedShort(), in.readUnsignedShort()));
+                    break;
                 case CONSTANT_NAMEANDTYPE:
                 case CONSTANT_CONSTANTDYNAMIC:
                 case CONSTANT_INVOKEDYNAMIC:
@@ -846,13 +866,13 @@
      *
      * getClassName
      *
-     * Safely gets a Java class name from a ConstantClass from a CPX2
constant pool
+     * Safely gets a Java class name from a ConstantClass from a
CPX2_ClassMember constant pool
      * object. (eg. Method/Field/Interface Ref)
      *
      * Returns either the Java class name, or a CP index reference string.
      *
      */
-    public String getClassName(CPX2 classConst) {
+    public String getClassName(CPX2_ClassMember classConst) {
         return _getClassName(classConst.value1);
     }

@@ -999,19 +1019,14 @@
         if (cns == null) {
             return "#" + cpx;
         }
-        switch (cns.tag) {
-            case CONSTANT_METHODHANDLE:
-            case CONSTANT_CONSTANTDYNAMIC:
-            case CONSTANT_INVOKEDYNAMIC:
-            case CONSTANT_METHOD:
-            case CONSTANT_INTERFACEMETHOD:
-            case CONSTANT_FIELD: {
-                CPX2 cns2 = (CPX2) cns;
-                if (cns2.value1 == cd.this_cpx) {
-                    cpx = cns2.value2;
-                }
+
+        if (cns instanceof CPX2_ClassMember) {
+            CPX2_ClassMember cns2 = (CPX2_ClassMember) cns;
+            if (cns2.value1 == cd.this_cpx) {
+                cpx = cns2.value2;
             }
         }
+
         return cns.tag.tagname + " " + StringValue(cpx);
     }


More information about the asmtools-dev mailing list