import java.io.DataOutputStream;
import java.io.IOException;
+import org.aspectj.apache.bcel.Constants;
import org.aspectj.apache.bcel.classfile.Constant;
import org.aspectj.apache.bcel.classfile.ConstantClass;
import org.aspectj.apache.bcel.classfile.ConstantPool;
-import org.aspectj.apache.bcel.Constants;
-/**
- * Slass for instructions that use an index into the
- * constant pool such as LDC, INVOKEVIRTUAL, etc.
- *
+import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen;
+import com.sun.org.apache.bcel.internal.generic.INVOKEVIRTUAL;
+import com.sun.org.apache.bcel.internal.generic.LDC;
+
+/**
+ * Slass for instructions that use an index into the constant pool such as LDC, INVOKEVIRTUAL, etc.
+ *
* @see ConstantPoolGen
* @see LDC
* @see INVOKEVIRTUAL
- *
- * @version $Id: InstructionCP.java,v 1.2 2008/05/28 23:52:57 aclement Exp $
- * @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
+ *
+ * @version $Id: InstructionCP.java,v 1.3 2008/08/28 00:05:49 aclement Exp $
+ * @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
*/
public class InstructionCP extends Instruction {
- protected int index; // index to constant pool
-
- public InstructionCP(short opcode, int index) {
- this.opcode = opcode;
- this.index = index;
- }
-
- public void dump(DataOutputStream out) throws IOException {
- if (opcode==LDC_W && index<256) {
- out.writeByte(LDC);
- out.writeByte(index);
- } else {
- out.writeByte(opcode);
- if(Constants.iLen[opcode] == 2) {
- if (index>255) {
- throw new IllegalStateException();
- }
- out.writeByte(index);
- } else
- out.writeShort(index);
- }
- }
-
- public int getLength() {
- if (opcode==LDC_W && index<256) return 2; else return super.getLength();
- }
-
- /**
- * Long output format:
- *
- * <name of opcode> "["<opcode number>"]"
- * "("<length of instruction>")" "<"< constant pool index>">"
- *
- * @param verbose long/short format switch
- * @return mnemonic for instruction
- */
- public String toString(boolean verbose) {
- return super.toString(verbose) + " " + index;
- }
-
- /**
- * @return mnemonic for instruction with symbolic references resolved
- */
- public String toString(ConstantPool cp) {
- Constant c = cp.getConstant(index);
- String str = cp.constantToString(c);
-
- if(c instanceof ConstantClass)
- str = str.replace('.', '/');
-
- return org.aspectj.apache.bcel.Constants.OPCODE_NAMES[opcode] + " " + str;
- }
-
- /**
- * @return index in constant pool referred by this instruction.
- */
- public final int getIndex() { return index; }
-
- public void setIndex(int index) {
- this.index = index;
- if (this.index>255 && opcode==LDC) {
- // promote it
- opcode = LDC_W;
- }
- }
-
- public Type getType(ConstantPool cpg) {
- switch (cpg.getConstant(index).getTag()) {
- case CONSTANT_String: return Type.STRING;
- case CONSTANT_Float: return Type.FLOAT;
- case CONSTANT_Integer: return Type.INT;
- case CONSTANT_Long: return Type.LONG;
- case CONSTANT_Double: return Type.DOUBLE;
- case CONSTANT_Class:
- String name = cpg.getConstantString_CONSTANTClass(index);
-// ConstantPool cp = cpg.getConstantPool();
-// String name = cp.getConstantString(index, CONSTANT_Class);
- if(!name.startsWith("[")) {
- StringBuffer sb = new StringBuffer();
- sb.append("L").append(name).append(";");
- return Type.getType(sb.toString());
- } else {
- return Type.getType(name);
- }
- default: // Never reached
- throw new RuntimeException("Unknown or invalid constant type at " + index);
- }
- }
-
- public Object getValue(ConstantPool cpg) {
- org.aspectj.apache.bcel.classfile.Constant c = cpg.getConstant(index);
-
- switch(c.getTag()) {
- case org.aspectj.apache.bcel.Constants.CONSTANT_String:
- int i = ((org.aspectj.apache.bcel.classfile.ConstantString)c).getStringIndex();
- c = cpg.getConstant(i);
- return ((org.aspectj.apache.bcel.classfile.ConstantUtf8)c).getBytes();
-
- case org.aspectj.apache.bcel.Constants.CONSTANT_Float:
- return new Float(((org.aspectj.apache.bcel.classfile.ConstantFloat)c).getBytes());
-
- case org.aspectj.apache.bcel.Constants.CONSTANT_Integer:
- return new Integer(((org.aspectj.apache.bcel.classfile.ConstantInteger)c).getBytes());
-
- // from ldc2_w:
- case org.aspectj.apache.bcel.Constants.CONSTANT_Long:
- return new Long(((org.aspectj.apache.bcel.classfile.ConstantLong)c).getBytes());
-
- case org.aspectj.apache.bcel.Constants.CONSTANT_Double:
- return new Double(((org.aspectj.apache.bcel.classfile.ConstantDouble)c).getBytes());
- default: // Never reached
- throw new RuntimeException("Unknown or invalid constant type at " + index);
- }
- }
-
-
- public Class[] getExceptions() {
- return org.aspectj.apache.bcel.ExceptionConstants.EXCS_STRING_RESOLUTION;
- }
+ protected int index; // index to constant pool
+
+ public InstructionCP(short opcode, int index) {
+ super(opcode);
+ this.index = index;
+ }
+
+ public void dump(DataOutputStream out) throws IOException {
+ if (opcode == LDC_W && index < 256) {
+ out.writeByte(LDC);
+ out.writeByte(index);
+ } else {
+ out.writeByte(opcode);
+ if (Constants.iLen[opcode] == 2) {
+ if (index > 255) {
+ throw new IllegalStateException();
+ }
+ out.writeByte(index);
+ } else {
+ out.writeShort(index);
+ }
+ }
+ }
+
+ public int getLength() {
+ if (opcode == LDC_W && index < 256) {
+ return 2;
+ } else {
+ return super.getLength();
+ }
+ }
+
+ /**
+ * Long output format:
+ *
+ * <name of opcode> "["<opcode number>"]" "("<length of instruction>")" "<"< constant pool
+ * index>">"
+ *
+ * @param verbose long/short format switch
+ * @return mnemonic for instruction
+ */
+ public String toString(boolean verbose) {
+ return super.toString(verbose) + " " + index;
+ }
+
+ /**
+ * @return mnemonic for instruction with symbolic references resolved
+ */
+ public String toString(ConstantPool cp) {
+ Constant c = cp.getConstant(index);
+ String str = cp.constantToString(c);
+
+ if (c instanceof ConstantClass) {
+ str = str.replace('.', '/');
+ }
+
+ return org.aspectj.apache.bcel.Constants.OPCODE_NAMES[opcode] + " " + str;
+ }
+
+ /**
+ * @return index in constant pool referred by this instruction.
+ */
+ public final int getIndex() {
+ return index;
+ }
+
+ public void setIndex(int index) {
+ this.index = index;
+ if (this.index > 255 && opcode == LDC) {
+ // promote it
+ opcode = LDC_W;
+ }
+ }
+
+ public Type getType(ConstantPool cpg) {
+ switch (cpg.getConstant(index).getTag()) {
+ case CONSTANT_String:
+ return Type.STRING;
+ case CONSTANT_Float:
+ return Type.FLOAT;
+ case CONSTANT_Integer:
+ return Type.INT;
+ case CONSTANT_Long:
+ return Type.LONG;
+ case CONSTANT_Double:
+ return Type.DOUBLE;
+ case CONSTANT_Class:
+ String name = cpg.getConstantString_CONSTANTClass(index);
+ // ConstantPool cp = cpg.getConstantPool();
+ // String name = cp.getConstantString(index, CONSTANT_Class);
+ if (!name.startsWith("[")) {
+ StringBuffer sb = new StringBuffer();
+ sb.append("L").append(name).append(";");
+ return Type.getType(sb.toString());
+ } else {
+ return Type.getType(name);
+ }
+ default: // Never reached
+ throw new RuntimeException("Unknown or invalid constant type at " + index);
+ }
+ }
+
+ public Object getValue(ConstantPool cpg) {
+ org.aspectj.apache.bcel.classfile.Constant c = cpg.getConstant(index);
+
+ switch (c.getTag()) {
+ case org.aspectj.apache.bcel.Constants.CONSTANT_String:
+ int i = ((org.aspectj.apache.bcel.classfile.ConstantString) c).getStringIndex();
+ c = cpg.getConstant(i);
+ return ((org.aspectj.apache.bcel.classfile.ConstantUtf8) c).getBytes();
+
+ case org.aspectj.apache.bcel.Constants.CONSTANT_Float:
+ return new Float(((org.aspectj.apache.bcel.classfile.ConstantFloat) c).getBytes());
+
+ case org.aspectj.apache.bcel.Constants.CONSTANT_Integer:
+ return new Integer(((org.aspectj.apache.bcel.classfile.ConstantInteger) c).getBytes());
+
+ // from ldc2_w:
+ case org.aspectj.apache.bcel.Constants.CONSTANT_Long:
+ return new Long(((org.aspectj.apache.bcel.classfile.ConstantLong) c).getBytes());
+
+ case org.aspectj.apache.bcel.Constants.CONSTANT_Double:
+ return new Double(((org.aspectj.apache.bcel.classfile.ConstantDouble) c).getBytes());
+ default: // Never reached
+ throw new RuntimeException("Unknown or invalid constant type at " + index);
+ }
+ }
+
+ public Class[] getExceptions() {
+ return org.aspectj.apache.bcel.ExceptionConstants.EXCS_STRING_RESOLUTION;
+ }
}