aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShigeru Chiba <chibash@users.noreply.github.com>2019-09-01 01:21:10 +0900
committerGitHub <noreply@github.com>2019-09-01 01:21:10 +0900
commit3dcbf5e3919d75f8f650ddb068db0ed7dcb2563d (patch)
treed30adaae30833bbd86f19b2d2ff39d0c4bd22991
parent8f4788e0907278cec2a094af179451824651a515 (diff)
parenta90bc27e5886d9cdd359580875e92bf0dd772a1f (diff)
downloadjavassist-3dcbf5e3919d75f8f650ddb068db0ed7dcb2563d.tar.gz
javassist-3dcbf5e3919d75f8f650ddb068db0ed7dcb2563d.zip
Merge pull request #272 from richbolen/JASSIST-270
JASSIST-270: Add support for the new Dynamic constant (17) created in java 11
-rw-r--r--pom.xml2
-rw-r--r--src/main/javassist/bytecode/ConstPool.java224
2 files changed, 177 insertions, 49 deletions
diff --git a/pom.xml b/pom.xml
index c3bd1990..c7b4bf81 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,7 +7,7 @@
Javassist (JAVA programming ASSISTant) makes Java bytecode manipulation
simple. It is a class library for editing bytecodes in Java.
</description>
- <version>3.25.0-GA</version>
+ <version>3.25.1-GA</version>
<name>Javassist</name>
<url>http://www.javassist.org/</url>
diff --git a/src/main/javassist/bytecode/ConstPool.java b/src/main/javassist/bytecode/ConstPool.java
index 0447ece7..a7537c49 100644
--- a/src/main/javassist/bytecode/ConstPool.java
+++ b/src/main/javassist/bytecode/ConstPool.java
@@ -105,7 +105,12 @@ public final class ConstPool
public static final int CONST_MethodType = MethodTypeInfo.tag;
/**
- * <code>CONSTANT_MethodHandle</code>
+ * <code>CONSTANT_Dynamic</code>
+ */
+ public static final int CONST_Dynamic = DynamicInfo.tag;
+
+ /**
+ * <code>CONSTANT_InvokeDynamic</code>
*/
public static final int CONST_InvokeDynamic = InvokeDynamicInfo.tag;
@@ -716,53 +721,99 @@ public final class ConstPool
return mtinfo.descriptor;
}
- /**
- * Reads the <code>bootstrap_method_attr_index</code> field of the
- * <code>CONSTANT_InvokeDynamic_info</code> structure
- * at the given index.
- *
- * @since 3.17
- */
- public int getInvokeDynamicBootstrap(int index)
- {
- InvokeDynamicInfo iv = (InvokeDynamicInfo)getItem(index);
- return iv.bootstrap;
- }
-
- /**
- * Reads the <code>name_and_type_index</code> field of the
- * <code>CONSTANT_InvokeDynamic_info</code> structure
- * at the given index.
- *
- * @since 3.17
- */
- public int getInvokeDynamicNameAndType(int index)
- {
- InvokeDynamicInfo iv = (InvokeDynamicInfo)getItem(index);
- return iv.nameAndType;
- }
-
- /**
- * Reads the <code>descriptor_index</code> field of the
- * <code>CONSTANT_NameAndType_info</code> structure
- * indirectly specified by the given index.
- *
- * @param index an index to a <code>CONSTANT_InvokeDynamic_info</code>.
- * @return the descriptor of the method.
- * @since 3.17
- */
- public String getInvokeDynamicType(int index)
- {
- InvokeDynamicInfo iv = (InvokeDynamicInfo)getItem(index);
- if (iv == null)
- return null;
- NameAndTypeInfo n = (NameAndTypeInfo)getItem(iv.nameAndType);
- if(n == null)
- return null;
- return getUtf8Info(n.typeDescriptor);
- }
-
- /**
+ /**
+ * Reads the <code>bootstrap_method_attr_index</code> field of the
+ * <code>CONSTANT_InvokeDynamic_info</code> structure
+ * at the given index.
+ *
+ * @since 3.17
+ */
+ public int getInvokeDynamicBootstrap(int index)
+ {
+ InvokeDynamicInfo iv = (InvokeDynamicInfo)getItem(index);
+ return iv.bootstrap;
+ }
+
+ /**
+ * Reads the <code>name_and_type_index</code> field of the
+ * <code>CONSTANT_InvokeDynamic_info</code> structure
+ * at the given index.
+ *
+ * @since 3.17
+ */
+ public int getInvokeDynamicNameAndType(int index)
+ {
+ InvokeDynamicInfo iv = (InvokeDynamicInfo)getItem(index);
+ return iv.nameAndType;
+ }
+
+ /**
+ * Reads the <code>descriptor_index</code> field of the
+ * <code>CONSTANT_NameAndType_info</code> structure
+ * indirectly specified by the given index.
+ *
+ * @param index an index to a <code>CONSTANT_InvokeDynamic_info</code>.
+ * @return the descriptor of the method.
+ * @since 3.17
+ */
+ public String getInvokeDynamicType(int index)
+ {
+ InvokeDynamicInfo iv = (InvokeDynamicInfo)getItem(index);
+ if (iv == null)
+ return null;
+ NameAndTypeInfo n = (NameAndTypeInfo)getItem(iv.nameAndType);
+ if(n == null)
+ return null;
+ return getUtf8Info(n.typeDescriptor);
+ }
+
+ /**
+ * Reads the <code>bootstrap_method_attr_index</code> field of the
+ * <code>CONSTANT_Dynamic_info</code> structure
+ * at the given index.
+ *
+ * @since 3.17
+ */
+ public int getDynamicBootstrap(int index)
+ {
+ DynamicInfo iv = (DynamicInfo)getItem(index);
+ return iv.bootstrap;
+ }
+
+ /**
+ * Reads the <code>name_and_type_index</code> field of the
+ * <code>CONSTANT_Dynamic_info</code> structure
+ * at the given index.
+ *
+ * @since 3.17
+ */
+ public int getDynamicNameAndType(int index)
+ {
+ DynamicInfo iv = (DynamicInfo)getItem(index);
+ return iv.nameAndType;
+ }
+
+ /**
+ * Reads the <code>descriptor_index</code> field of the
+ * <code>CONSTANT_NameAndType_info</code> structure
+ * indirectly specified by the given index.
+ *
+ * @param index an index to a <code>CONSTANT_Dynamic_info</code>.
+ * @return the descriptor of the method.
+ * @since 3.17
+ */
+ public String getDynamicType(int index)
+ {
+ DynamicInfo iv = (DynamicInfo)getItem(index);
+ if (iv == null)
+ return null;
+ NameAndTypeInfo n = (NameAndTypeInfo)getItem(iv.nameAndType);
+ if(n == null)
+ return null;
+ return getUtf8Info(n.typeDescriptor);
+ }
+
+ /**
* Reads the <code>name_index</code> field of the
* <code>CONSTANT_Module_info</code> structure at the given index.
*
@@ -1196,6 +1247,18 @@ public final class ConstPool
}
/**
+ * Adds a new <code>CONSTANT_Dynamic_info</code> structure.
+ *
+ * @param bootstrap <code>bootstrap_method_attr_index</code>.
+ * @param nameAndType <code>name_and_type_index</code>.
+ * @return the index of the added entry.
+ * @since 3.17
+ */
+ public int addDynamicInfo(int bootstrap, int nameAndType) {
+ return addItem(new DynamicInfo(bootstrap, nameAndType, numOfItems));
+ }
+
+ /**
* Adds a new <code>CONSTANT_Module_info</code>
* @param nameIndex the index of the Utf8 entry.
* @return the index of the added entry.
@@ -1342,6 +1405,9 @@ public final class ConstPool
case MethodTypeInfo.tag : // 16
info = new MethodTypeInfo(in, numOfItems);
break;
+ case DynamicInfo.tag : // 17
+ info = new DynamicInfo(in, numOfItems);
+ break;
case InvokeDynamicInfo.tag : // 18
info = new InvokeDynamicInfo(in, numOfItems);
break;
@@ -2322,6 +2388,68 @@ class InvokeDynamicInfo extends ConstInfo
}
}
+class DynamicInfo extends ConstInfo {
+
+ static final int tag = 17;
+ int bootstrap, nameAndType;
+
+ public DynamicInfo(int bootstrapMethod,
+ int ntIndex, int index) {
+ super(index);
+ bootstrap = bootstrapMethod;
+ nameAndType = ntIndex;
+ }
+
+ public DynamicInfo(DataInputStream in, int index)
+ throws IOException {
+ super(index);
+ bootstrap = in.readUnsignedShort();
+ nameAndType = in.readUnsignedShort();
+ }
+
+ @Override
+ public int hashCode() {
+ return (bootstrap << 16) ^ nameAndType;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof DynamicInfo) {
+ DynamicInfo iv = (DynamicInfo) obj;
+ return iv.bootstrap == bootstrap
+ && iv.nameAndType == nameAndType;
+ }
+ return false;
+ }
+
+ @Override
+ public int getTag() {
+ return tag;
+ }
+
+ @Override
+ public int copy(ConstPool src, ConstPool dest,
+ Map<String, String> map) {
+ return dest.addDynamicInfo(bootstrap,
+ src.getItem(nameAndType).copy(src, dest, map));
+ }
+
+ @Override
+ public void write(DataOutputStream out) throws IOException {
+ out.writeByte(tag);
+ out.writeShort(bootstrap);
+ out.writeShort(nameAndType);
+ }
+
+ @Override
+ public void print(PrintWriter out) {
+ out.print("Dynamic #");
+ out.print(bootstrap);
+ out.print(", name&type #");
+ out.println(nameAndType);
+ }
+}
+
class ModuleInfo extends ConstInfo
{
static final int tag = 19;