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    }