001 package serp.bytecode.lowlevel;
002
003 import java.io.DataInput;
004 import java.io.DataOutput;
005 import java.io.IOException;
006
007 import serp.bytecode.visitor.BCVisitor;
008
009 /**
010 * InvokeDynamic
011 * u1 tag
012 * u2 bootstrap_method_attr_index // References entry in Bootstrap Methods table
013 * u2 name_and_type_index // References NameAndTypeEntry representing method name and descriptor
014 *
015 */
016 public class InvokeDynamicEntry extends Entry {
017 private int _bootstrap_method_attr_index;
018 private int _name_and_type_index;
019
020 public InvokeDynamicEntry() {
021
022 }
023
024 public InvokeDynamicEntry(int bootstrap_method_attr_index, int nameAndTypeIndex) {
025 _bootstrap_method_attr_index = bootstrap_method_attr_index;
026 _name_and_type_index = nameAndTypeIndex;
027 }
028
029 public void acceptVisit(BCVisitor visitor) {
030 visitor.enterInvokeDynamicEntry(this);
031 visitor.exitInvokeDynamicEntry(this);
032 }
033
034 public int getType() {
035 return Entry.INVOKEDYNAMIC;
036 }
037
038 void readData(DataInput in) throws IOException {
039 _bootstrap_method_attr_index = in.readUnsignedShort();
040 _name_and_type_index = in.readUnsignedShort();
041 }
042
043 void writeData(DataOutput out) throws IOException {
044 out.writeShort(_bootstrap_method_attr_index);
045 out.writeShort(_name_and_type_index);
046 }
047
048 public int getBootstrapMethodAttrIndex() {
049 return _bootstrap_method_attr_index;
050 }
051
052 /**
053 * Return the constant pool index of the {@link NameAndTypeEntry}
054 * describing this entity.
055 */
056 public int getNameAndTypeIndex() {
057 return _name_and_type_index;
058 }
059 /**
060 * Return the referenced {@link NameAndTypeEntry}. This method can only
061 * be run for entries that have been added to a constant pool.
062 */
063 public NameAndTypeEntry getNameAndTypeEntry() {
064 return (NameAndTypeEntry) getPool().getEntry(_name_and_type_index);
065 }
066 }