001 /*
002 * @(#)APoolInfo.java 1.5 95/08/16 Chuck McManis
003 *
004 * Copyright (c) 1996 Chuck McManis, All Rights Reserved.
005 *
006 * Permission to use, copy, modify, and distribute this software
007 * and its documentation for NON-COMMERCIAL purposes and without
008 * fee is hereby granted provided that this copyright notice
009 * appears in all copies.
010 *
011 * CHUCK MCMANIS MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY
012 * OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
013 * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
014 * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. CHUCK MCMANIS SHALL NOT BE
015 * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING,
016 * MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
017 */
018
019 package edu.rice.cs.cunit.classFile.constantPool;
020
021 import edu.rice.cs.cunit.classFile.constantPool.visitors.IPoolInfoVisitor;
022
023 import edu.rice.cs.cunit.util.PositionDataInputStream;
024 import java.io.DataOutputStream;
025 import java.io.IOException;
026 import java.util.ArrayList;
027
028 /**
029 * Represents an abstract constant pool object.
030 *
031 * @author Mathias Ricken
032 */
033 public abstract class APoolInfo {
034 // Constant pool object types
035 public static final int CONSTANT_Class = 7;
036 public static final int CONSTANT_Fieldref = 9;
037 public static final int CONSTANT_Methodref = 10;
038 public static final int CONSTANT_InterfaceMethodref = 11;
039 public static final int CONSTANT_String = 8;
040 public static final int CONSTANT_Integer = 3;
041 public static final int CONSTANT_Float = 4;
042 public static final int CONSTANT_Long = 5;
043 public static final int CONSTANT_Double = 6;
044 public static final int CONSTANT_NameAndType = 12;
045 public static final int CONSTANT_Utf8_ASCII = 1;
046 public static final int CONSTANT_Utf8_Unicode = 2;
047
048 /**
049 * Object type.
050 */
051 protected int _type;
052
053 /**
054 * Reference to the constant pool.
055 */
056 protected ConstantPool _constantPool;
057
058 /**
059 * Constructor
060 *
061 * @param type object type
062 */
063 public APoolInfo(int type, ConstantPool cp) {
064 _type = type;
065 _constantPool = cp;
066 }
067
068 /**
069 * Read from stream and return unresolved constant pool object.
070 *
071 * @param dis stream
072 *
073 * @return unresolved constant pool object.
074 *
075 * @throws IOException
076 * @throws ClassFormatError
077 */
078 public static APoolInfo read(PositionDataInputStream dis, ConstantPool cp) throws IOException, ClassFormatError {
079 int type = dis.readByte();
080 APoolInfo item;
081 switch(type) {
082 case CONSTANT_Class:
083 item = new ClassPoolInfo(dis, cp);
084 break;
085 case CONSTANT_Fieldref:
086 item = new FieldPoolInfo(dis, cp);
087 break;
088 case CONSTANT_Methodref:
089 item = new MethodPoolInfo(dis, cp);
090 break;
091 case CONSTANT_InterfaceMethodref:
092 item = new InterfaceMethodPoolInfo(dis, cp);
093 break;
094 case CONSTANT_NameAndType:
095 item = new NameAndTypePoolInfo(dis, cp);
096 break;
097 case CONSTANT_String:
098 item = new StringPoolInfo(dis, cp);
099 break;
100 case CONSTANT_Integer:
101 item = new IntegerPoolInfo(dis, cp);
102 break;
103 case CONSTANT_Float:
104 item = new FloatPoolInfo(dis, cp);
105 break;
106 case CONSTANT_Long:
107 item = new LongPoolInfo(dis, cp);
108 break;
109 case CONSTANT_Double:
110 item = new DoublePoolInfo(dis, cp);
111 break;
112 case CONSTANT_Utf8_ASCII:
113 item = new ASCIIPoolInfo(dis, cp);
114 break;
115 case CONSTANT_Utf8_Unicode:
116 item = new UnicodePoolInfo(dis, cp);
117 break;
118 default:
119 throw new ClassFormatError("Unknown constant pool item type: "+type+", offset: "+(dis.getPosition()-1));
120 }
121 return item;
122 }
123
124 /**
125 * Return the reference to the constant pool item that is already in pool, that matches this one.
126 *
127 * @param pool constant pool
128 *
129 * @return matching object or null if not found
130 */
131 public APoolInfo inPool(ConstantPool pool) {
132 for(APoolInfo cpi : pool) {
133 if (this.equals(cpi)) {
134 return cpi;
135 }
136 }
137 return null;
138 }
139
140 /**
141 * Write this constant pool object into the stream, including the type byte.
142 *
143 * @param dos stream
144 *
145 * @throws IOException
146 */
147 public abstract void write(DataOutputStream dos) throws IOException;
148
149 /**
150 * Resolve constant pool objects. This makes sure that the object links match the index links.
151 */
152 public abstract void resolve();
153
154 /**
155 * Reindex constant pool indices. This makes sure the index links match the object links.
156 */
157 public abstract void reindex();
158
159 /**
160 * Return a human-readable version of this constant pool object.
161 *
162 * @return string
163 */
164 public abstract String toStringVerbose();
165
166 /**
167 * Return a human-readable version of this constant pool object.
168 *
169 * @return string
170 */
171 public abstract String toString();
172
173 /**
174 * Return a hash code.
175 *
176 * @return hash code
177 */
178 public abstract int hashCode();
179
180 /**
181 * Compare this object and another one.
182 *
183 * @param obj other object
184 *
185 * @return true if the same
186 */
187 public abstract boolean equals(Object obj);
188
189 /**
190 * Execute a visitor.
191 *
192 * @param visitor visitor
193 * @param data visitor-specific parameter
194 *
195 * @return visitor-specific return value
196 */
197 public abstract <R, D> R execute(IPoolInfoVisitor<R, D> visitor, D data);
198 }