001    package serp.bytecode.lowlevel;
002    
003    import java.io.*;
004    
005    import serp.bytecode.visitor.*;
006    
007    /**
008     * A String constant in the constant pool. String constants
009     * hold a reference to a {@link UTF8Entry} that stores the actual value.
010     *
011     * @author Abe White
012     */
013    public class StringEntry extends Entry implements ConstantEntry {
014        private int _stringIndex = -1;
015    
016        /**
017         * Default constructor.
018         */
019        public StringEntry() {
020        }
021    
022        /**
023         * Constructor.
024         *
025         * @param stringIndex the constant pool index of the {@link UTF8Entry}
026         * containing the value of this string
027         */
028        public StringEntry(int stringIndex) {
029            _stringIndex = stringIndex;
030        }
031    
032        public int getType() {
033            return Entry.STRING;
034        }
035    
036        /**
037         * Return the constant pool index of the {@link UTF8Entry}
038         * storing the value of this string.
039         */
040        public int getStringIndex() {
041            return _stringIndex;
042        }
043    
044        /**
045         * Set the constant pool index of the {@link UTF8Entry}
046         * storing the value of this string.
047         */
048        public void setStringIndex(int stringIndex) {
049            Object key = beforeModify();
050            _stringIndex = stringIndex;
051            afterModify(key);
052        }
053    
054        /**
055         * Return the referenced {@link UTF8Entry}. This method can only
056         * be run for entries that have been added to a constant pool.
057         */
058        public UTF8Entry getStringEntry() {
059            return (UTF8Entry) getPool().getEntry(_stringIndex);
060        }
061    
062        public Object getConstant() {
063            return getStringEntry().getValue();
064        }
065    
066        public void setConstant(Object value) {
067            getStringEntry().setConstant(value);
068        }
069    
070        public void acceptVisit(BCVisitor visit) {
071            visit.enterStringEntry(this);
072            visit.exitStringEntry(this);
073        }
074    
075        void readData(DataInput in) throws IOException {
076            _stringIndex = in.readUnsignedShort();
077        }
078    
079        void writeData(DataOutput out) throws IOException {
080            out.writeShort(_stringIndex);
081        }
082    }