00001 package de.fub.bytecode.generic;
00002
00003 import java.io.*;
00004 import de.fub.bytecode.util.ByteSequence;
00005 import de.fub.bytecode.Constants;
00006 import de.fub.bytecode.classfile.*;
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 public abstract class CPInstruction extends Instruction implements Constants {
00020 protected int index;
00021
00022
00023
00024
00025
00026 CPInstruction() {}
00027
00028
00029
00030 protected CPInstruction(short tag, int index) {
00031 super(tag, (short)3);
00032 setIndex(index);
00033 }
00034
00035
00036
00037
00038 public void dump(DataOutputStream out) throws IOException {
00039 out.writeByte(tag);
00040 out.writeShort(index);
00041 }
00042
00043
00044
00045 public final int getIndex() { return index; }
00046
00047
00048 public Type getType(ConstantPoolGen cpg) {
00049 ConstantPool cp = cpg.getConstantPool();
00050 String name = cp.getConstantString(index, CONSTANT_Class);
00051
00052 if(!name.startsWith("["))
00053 name = "L" + name + ";";
00054
00055 return Type.getType(name);
00056 }
00057
00058
00059
00060 protected void initFromFile(ByteSequence bytes, boolean wide)
00061 throws IOException
00062 {
00063 setIndex(bytes.readUnsignedShort());
00064 length = 3;
00065 }
00066
00067
00068
00069 public void setIndex(int index) {
00070 if(index < 0)
00071 throw new ClassGenException("Negative index value: " + index);
00072
00073 this.index = index;
00074 }
00075
00076
00077
00078 public String toString(ConstantPool cp) {
00079 Constant c = cp.getConstant(index);
00080 String str = cp.constantToString(c);
00081
00082 if(c instanceof ConstantClass)
00083 str = str.replace('.', '/');
00084
00085 return OPCODE_NAMES[tag] + " " + str;
00086 }
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096 public String toString(boolean verbose) {
00097 return super.toString(verbose) + " " + index;
00098 }
00099 }