00001 package de.fub.bytecode.generic;
00002
00003 import java.io.*;
00004 import de.fub.bytecode.util.ByteSequence;
00005 import de.fub.bytecode.classfile.Utility;
00006
00007
00008
00009
00010
00011
00012
00013 public abstract class LocalVariableInstruction extends Instruction {
00014 private int n;
00015 private short c_tag;
00016 private short canon_tag;
00017
00018
00019
00020
00021
00022
00023 LocalVariableInstruction(short canon_tag, short c_tag) {
00024 super();
00025 this.canon_tag = canon_tag;
00026 this.c_tag = c_tag;
00027 }
00028
00029
00030
00031
00032
00033 protected LocalVariableInstruction(short tag, short c_tag, int n) {
00034 super(tag, (short)2);
00035
00036 this.c_tag = c_tag;
00037 canon_tag = tag;
00038
00039 setIndex(n);
00040 }
00041
00042
00043
00044
00045 public void dump(DataOutputStream out) throws IOException {
00046 if(wide())
00047 out.writeByte(WIDE);
00048
00049 out.writeByte(tag);
00050
00051 if(length > 1) {
00052 if(wide())
00053 out.writeShort(n);
00054 else
00055 out.writeByte(n);
00056 }
00057 }
00058
00059
00060
00061 public final int getIndex() { return n; }
00062
00063
00064
00065
00066 protected void initFromFile(ByteSequence bytes, boolean wide)
00067 throws IOException
00068 {
00069 if(wide) {
00070 n = bytes.readUnsignedShort();
00071 length = 4;
00072 } else if(((tag >= ILOAD) && (tag <= ALOAD)) ||
00073 ((tag >= ISTORE) && (tag <= ASTORE))) {
00074 n = bytes.readUnsignedByte();
00075 length = 2;
00076 } else if(tag <= ALOAD_3) {
00077 n = (tag - ILOAD_0) % 4;
00078 length = 1;
00079 } else {
00080 n = (tag - ISTORE_0) % 4;
00081 length = 1;
00082 }
00083 }
00084
00085
00086
00087 public final void setIndex(int n) {
00088 if((n < 0) || (n > MAX_SHORT))
00089 throw new ClassGenException("Illegal value: " + n);
00090
00091 this.n = n;
00092
00093 if(n >= 0 && n <= 3) {
00094 tag = (short)(c_tag + n);
00095 length = 1;
00096 } else {
00097 tag = canon_tag;
00098
00099 if(wide())
00100 length = 4;
00101 else
00102 length = 2;
00103 }
00104 }
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114 public String toString(boolean verbose) {
00115 if(((tag >= ILOAD_0) && (tag <= ALOAD_3)) ||
00116 ((tag >= ISTORE_0) && (tag <= ASTORE_3)))
00117 return super.toString(verbose);
00118 else
00119 return super.toString(verbose) + " " + n;
00120 }
00121 private final boolean wide() { return n > MAX_BYTE; }
00122 }