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.
*
}
/**
+ * Adds a new <code>CONSTANT_InvokeDynamic_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.
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;
}
}
+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;
assertEquals("(I)V", cPool2.getUtf8Info(cPool2.getMethodTypeInfo(mtIndex)));
}
+// public void testDynamicInfo() throws Exception {
+// ClassFile cf = new ClassFile(false, "test4.Dyn", null);
+// cf.setInterfaces(new String[] { "java.lang.Cloneable" });
+// ConstPool cp = cf.getConstPool();
+//
+// Bytecode code = new Bytecode(cp, 0, 1);
+// code.addAload(0);
+// code.addIconst(9);
+// code.addLdc("nine");
+// code.addDynamic(0, "call", "I");
+// code.addOpcode(Opcode.SWAP);
+// code.addOpcode(Opcode.POP);
+// code.addOpcode(Opcode.IRETURN);
+//
+// FieldInfo fieldInfo = new FieldInfo(cp, "test", "S");
+// fieldInfo.setAccessFlags(AccessFlag.PUBLIC);
+// cf.addField(fieldInfo);
+//
+// String desc
+// = "(Ljava/lang/String;)I";
+// int mri = cp.addMethodrefInfo(cp.addClassInfo("Dyn"), "boot", desc);
+// int mhi = cp.addMethodHandleInfo(ConstPool.REF_invokeStatic, mri);
+// int[] args = new int[0];
+// BootstrapMethodsAttribute.BootstrapMethod[] bms
+// = new BootstrapMethodsAttribute.BootstrapMethod[1];
+// bms[0] = new BootstrapMethodsAttribute.BootstrapMethod(mhi, args);
+//
+// cf.addAttribute(new BootstrapMethodsAttribute(cp, bms));
+//
+// cf.write(new DataOutputStream(new FileOutputStream("test4/Dyn.class")));
+//
+// Object obj = make(cf.getName());
+//
+// assertNotNull(obj);
+// }
+
public static Test suite() {
TestSuite suite = new TestSuite("Bytecode Tests");
suite.addTestSuite(BytecodeTest.class);