1 package serp.bytecode.lowlevel;
2
3 import java.io.*;
4
5 /***
6 * Base class for field, method, and interface method constant pool
7 * entries. All complex entries reference the {@link ClassEntry} of the
8 * class that owns the entity and a {@link NameAndTypeEntry} describing
9 * the entity.
10 *
11 * @author Abe White
12 */
13 public abstract class ComplexEntry extends Entry {
14 private int _classIndex = 0;
15 private int _nameAndTypeIndex = 0;
16
17 /***
18 * Default constructor.
19 */
20 public ComplexEntry() {
21 }
22
23 /***
24 * Constructor.
25 *
26 * @param classIndex the constant pool index of the
27 * {@link ClassEntry} describing the owner of this entity
28 * @param nameAndTypeIndex the constant pool index of the
29 * {@link NameAndTypeEntry} describing this entity
30 */
31 public ComplexEntry(int classIndex, int nameAndTypeIndex) {
32 _classIndex = classIndex;
33 _nameAndTypeIndex = nameAndTypeIndex;
34 }
35
36 /***
37 * Return the constant pool index of the {@link ClassEntry} describing
38 * the owning class of this entity. Defaults to 0.
39 */
40 public int getClassIndex() {
41 return _classIndex;
42 }
43
44 /***
45 * Set the constant pool index of the {@link ClassEntry} describing
46 * the owning class of this entity.
47 */
48 public void setClassIndex(int classIndex) {
49 Object key = beforeModify();
50 _classIndex = classIndex;
51 afterModify(key);
52 }
53
54 /***
55 * Return the referenced {@link ClassEntry}. This method can only
56 * be run for entries that have been added to a constant pool.
57 */
58 public ClassEntry getClassEntry() {
59 return (ClassEntry) getPool().getEntry(_classIndex);
60 }
61
62 /***
63 * Return the constant pool index of the {@link NameAndTypeEntry}
64 * describing this entity.
65 */
66 public int getNameAndTypeIndex() {
67 return _nameAndTypeIndex;
68 }
69
70 /***
71 * Set the constant pool index of the {@link NameAndTypeEntry}
72 * describing this entity.
73 */
74 public void setNameAndTypeIndex(int nameAndTypeIndex) {
75 Object key = beforeModify();
76 _nameAndTypeIndex = nameAndTypeIndex;
77 afterModify(key);
78 }
79
80 /***
81 * Return the referenced {@link NameAndTypeEntry}. This method can only
82 * be run for entries that have been added to a constant pool.
83 */
84 public NameAndTypeEntry getNameAndTypeEntry() {
85 return (NameAndTypeEntry) getPool().getEntry(_nameAndTypeIndex);
86 }
87
88 void readData(DataInput in) throws IOException {
89 _classIndex = in.readUnsignedShort();
90 _nameAndTypeIndex = in.readUnsignedShort();
91 }
92
93 void writeData(DataOutput out) throws IOException {
94 out.writeShort(_classIndex);
95 out.writeShort(_nameAndTypeIndex);
96 }
97 }