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 }