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