001package serp.bytecode.lowlevel;
002
003import java.io.*;
004
005import serp.bytecode.visitor.*;
006
007/**
008 * Entry containing indexes referencing a name and a descriptor. Used
009 * to describe fields and methods of other classes referenced by opcodes.
010 *
011 * @author Abe White
012 */
013public class NameAndTypeEntry extends Entry {
014    private int _nameIndex = 0;
015    private int _descriptorIndex = 0;
016
017    /**
018     * Default constructor.
019     */
020    public NameAndTypeEntry() {
021    }
022
023    /**
024     * Constructor.
025     *
026     * @param nameIndex the constant pool index of the
027     * {@link UTF8Entry} containing the name of this entity
028     * @param descriptorIndex the constant pool index of the
029     * {@link UTF8Entry} containing the descriptor for this entity
030     */
031    public NameAndTypeEntry(int nameIndex, int descriptorIndex) {
032        _nameIndex = nameIndex;
033        _descriptorIndex = descriptorIndex;
034    }
035
036    public int getType() {
037        return Entry.NAMEANDTYPE;
038    }
039
040    /**
041     * Return the constant pool index of the {@link UTF8Entry}
042     * containing the name of this entity.
043     */
044    public int getNameIndex() {
045        return _nameIndex;
046    }
047
048    /**
049     * Set the constant pool index of the {@link UTF8Entry}
050     * containing the name of this entity.
051     */
052    public void setNameIndex(int nameIndex) {
053        Object key = beforeModify();
054        _nameIndex = nameIndex;
055        afterModify(key);
056    }
057
058    /**
059     * Return the name's referenced {@link UTF8Entry}. This method can only
060     * be run for entries that have been added to a constant pool.
061     */
062    public UTF8Entry getNameEntry() {
063        return (UTF8Entry) getPool().getEntry(_nameIndex);
064    }
065
066    /**
067     * Return the constant pool index of the {@link UTF8Entry}
068     * containing the descriptor for this entity.
069     */
070    public int getDescriptorIndex() {
071        return _descriptorIndex;
072    }
073
074    /**
075     * Set the constant pool index of a {@link UTF8Entry}
076     * containing the descriptor for this entity.
077     */
078    public void setDescriptorIndex(int descriptorIndex) {
079        Object key = beforeModify();
080        _descriptorIndex = descriptorIndex;
081        afterModify(key);
082    }
083
084    /**
085     * Return the descriptor's referenced {@link UTF8Entry}. This method
086     * can only be run for entries that have been added to a constant pool.
087     */
088    public UTF8Entry getDescriptorEntry() {
089        return (UTF8Entry) getPool().getEntry(_descriptorIndex);
090    }
091
092    public void acceptVisit(BCVisitor visit) {
093        visit.enterNameAndTypeEntry(this);
094        visit.exitNameAndTypeEntry(this);
095    }
096
097    void readData(DataInput in) throws IOException {
098        _nameIndex = in.readUnsignedShort();
099        _descriptorIndex = in.readUnsignedShort();
100    }
101
102    void writeData(DataOutput out) throws IOException {
103        out.writeShort(_nameIndex);
104        out.writeShort(_descriptorIndex);
105    }
106}