001package serp.bytecode;
002
003/**
004 * Interface to track constants used in bytecode. Entities can access these
005 * constants using the static <code>Constants.</code> field prefix,
006 * or implement this interface themselves to conveniently import the
007 * constants into their own namespace.
008 *
009 * @author Abe White
010 */
011public interface Constants {
012    // class magic number
013    public static final int VALID_MAGIC = 0xcafebabe;
014
015    // standard major, minor versions
016    public static final int MAJOR_VERSION = 45;
017    public static final int MINOR_VERSION = 3;
018    public static final int MAJOR_VERSION_JAVA5 = 49;
019    public static final int MINOR_VERSION_JAVA5 = 0;
020
021    // access constants for classes, fields, methods
022    public static final int ACCESS_PUBLIC = 0x0001;
023    public static final int ACCESS_PRIVATE = 0x0002;
024    public static final int ACCESS_PROTECTED = 0x0004;
025    public static final int ACCESS_STATIC = 0x0008;
026    public static final int ACCESS_FINAL = 0x0010;
027    public static final int ACCESS_SUPER = 0x0020;
028    public static final int ACCESS_SYNCHRONIZED = 0x0020;
029    public static final int ACCESS_VOLATILE = 0x0040;
030    public static final int ACCESS_BRIDGE = 0x0040;
031    public static final int ACCESS_TRANSIENT = 0x0080;
032    public static final int ACCESS_VARARGS = 0x0080;
033    public static final int ACCESS_NATIVE = 0x0100;
034    public static final int ACCESS_INTERFACE = 0x0200;
035    public static final int ACCESS_ABSTRACT = 0x0400;
036    public static final int ACCESS_STRICT = 0x0800;
037    public static final int ACCESS_SYNTHETIC = 0x1000;
038    public static final int ACCESS_ANNOTATION = 0x2000;
039    public static final int ACCESS_ENUM = 0x4000;
040
041    // attribute types the compiler must support
042    public static final String ATTR_CODE = "Code";
043    public static final String ATTR_CONST = "ConstantValue";
044    public static final String ATTR_DEPRECATED = "Deprecated";
045    public static final String ATTR_EXCEPTIONS = "Exceptions";
046    public static final String ATTR_INNERCLASS = "InnerClasses";
047    public static final String ATTR_LINENUMBERS = "LineNumberTable";
048    public static final String ATTR_LOCALS = "LocalVariableTable";
049    public static final String ATTR_LOCAL_TYPES = "LocalVariableTypeTable";
050    public static final String ATTR_SOURCE = "SourceFile";
051    public static final String ATTR_SYNTHETIC = "Synthetic";
052    public static final String ATTR_UNKNOWN = "Unknown";
053    public static final String ATTR_ANNOTATIONS = "RuntimeInvisibleAnnotations";
054    public static final String ATTR_RUNTIME_ANNOTATIONS = 
055        "RuntimeVisibleAnnotations";
056
057    // opcodes
058    public static final int NOP = 0;
059    public static final int ACONSTNULL = 1;
060    public static final int ICONSTM1 = 2;
061    public static final int ICONST0 = 3;
062    public static final int ICONST1 = 4;
063    public static final int ICONST2 = 5;
064    public static final int ICONST3 = 6;
065    public static final int ICONST4 = 7;
066    public static final int ICONST5 = 8;
067    public static final int LCONST0 = 9;
068    public static final int LCONST1 = 10;
069    public static final int FCONST0 = 11;
070    public static final int FCONST1 = 12;
071    public static final int FCONST2 = 13;
072    public static final int DCONST0 = 14;
073    public static final int DCONST1 = 15;
074    public static final int BIPUSH = 16;
075    public static final int SIPUSH = 17;
076    public static final int LDC = 18;
077    public static final int LDCW = 19;
078    public static final int LDC2W = 20;
079    public static final int ILOAD = 21;
080    public static final int LLOAD = 22;
081    public static final int FLOAD = 23;
082    public static final int DLOAD = 24;
083    public static final int ALOAD = 25;
084    public static final int ILOAD0 = 26;
085    public static final int ILOAD1 = 27;
086    public static final int ILOAD2 = 28;
087    public static final int ILOAD3 = 29;
088    public static final int LLOAD0 = 30;
089    public static final int LLOAD1 = 31;
090    public static final int LLOAD2 = 32;
091    public static final int LLOAD3 = 33;
092    public static final int FLOAD0 = 34;
093    public static final int FLOAD1 = 35;
094    public static final int FLOAD2 = 36;
095    public static final int FLOAD3 = 37;
096    public static final int DLOAD0 = 38;
097    public static final int DLOAD1 = 39;
098    public static final int DLOAD2 = 40;
099    public static final int DLOAD3 = 41;
100    public static final int ALOAD0 = 42;
101    public static final int ALOAD1 = 43;
102    public static final int ALOAD2 = 44;
103    public static final int ALOAD3 = 45;
104    public static final int IALOAD = 46;
105    public static final int LALOAD = 47;
106    public static final int FALOAD = 48;
107    public static final int DALOAD = 49;
108    public static final int AALOAD = 50;
109    public static final int BALOAD = 51;
110    public static final int CALOAD = 52;
111    public static final int SALOAD = 53;
112    public static final int ISTORE = 54;
113    public static final int LSTORE = 55;
114    public static final int FSTORE = 56;
115    public static final int DSTORE = 57;
116    public static final int ASTORE = 58;
117    public static final int ISTORE0 = 59;
118    public static final int ISTORE1 = 60;
119    public static final int ISTORE2 = 61;
120    public static final int ISTORE3 = 62;
121    public static final int LSTORE0 = 63;
122    public static final int LSTORE1 = 64;
123    public static final int LSTORE2 = 65;
124    public static final int LSTORE3 = 66;
125    public static final int FSTORE0 = 67;
126    public static final int FSTORE1 = 68;
127    public static final int FSTORE2 = 69;
128    public static final int FSTORE3 = 70;
129    public static final int DSTORE0 = 71;
130    public static final int DSTORE1 = 72;
131    public static final int DSTORE2 = 73;
132    public static final int DSTORE3 = 74;
133    public static final int ASTORE0 = 75;
134    public static final int ASTORE1 = 76;
135    public static final int ASTORE2 = 77;
136    public static final int ASTORE3 = 78;
137    public static final int IASTORE = 79;
138    public static final int LASTORE = 80;
139    public static final int FASTORE = 81;
140    public static final int DASTORE = 82;
141    public static final int AASTORE = 83;
142    public static final int BASTORE = 84;
143    public static final int CASTORE = 85;
144    public static final int SASTORE = 86;
145    public static final int POP = 87;
146    public static final int POP2 = 88;
147    public static final int DUP = 89;
148    public static final int DUPX1 = 90;
149    public static final int DUPX2 = 91;
150    public static final int DUP2 = 92;
151    public static final int DUP2X1 = 93;
152    public static final int DUP2X2 = 94;
153    public static final int SWAP = 95;
154    public static final int IADD = 96;
155    public static final int LADD = 97;
156    public static final int FADD = 98;
157    public static final int DADD = 99;
158    public static final int ISUB = 100;
159    public static final int LSUB = 101;
160    public static final int FSUB = 102;
161    public static final int DSUB = 103;
162    public static final int IMUL = 104;
163    public static final int LMUL = 105;
164    public static final int FMUL = 106;
165    public static final int DMUL = 107;
166    public static final int IDIV = 108;
167    public static final int LDIV = 109;
168    public static final int FDIV = 110;
169    public static final int DDIV = 111;
170    public static final int IREM = 112;
171    public static final int LREM = 113;
172    public static final int FREM = 114;
173    public static final int DREM = 115;
174    public static final int INEG = 116;
175    public static final int LNEG = 117;
176    public static final int FNEG = 118;
177    public static final int DNEG = 119;
178    public static final int ISHL = 120;
179    public static final int LSHL = 121;
180    public static final int ISHR = 122;
181    public static final int LSHR = 123;
182    public static final int IUSHR = 124;
183    public static final int LUSHR = 125;
184    public static final int IAND = 126;
185    public static final int LAND = 127;
186    public static final int IOR = 128;
187    public static final int LOR = 129;
188    public static final int IXOR = 130;
189    public static final int LXOR = 131;
190    public static final int IINC = 132;
191    public static final int I2L = 133;
192    public static final int I2F = 134;
193    public static final int I2D = 135;
194    public static final int L2I = 136;
195    public static final int L2F = 137;
196    public static final int L2D = 138;
197    public static final int F2I = 139;
198    public static final int F2L = 140;
199    public static final int F2D = 141;
200    public static final int D2I = 142;
201    public static final int D2L = 143;
202    public static final int D2F = 144;
203    public static final int I2B = 145;
204    public static final int I2C = 146;
205    public static final int I2S = 147;
206    public static final int LCMP = 148;
207    public static final int FCMPL = 149;
208    public static final int FCMPG = 150;
209    public static final int DCMPL = 151;
210    public static final int DCMPG = 152;
211    public static final int IFEQ = 153;
212    public static final int IFNE = 154;
213    public static final int IFLT = 155;
214    public static final int IFGE = 156;
215    public static final int IFGT = 157;
216    public static final int IFLE = 158;
217    public static final int IFICMPEQ = 159;
218    public static final int IFICMPNE = 160;
219    public static final int IFICMPLT = 161;
220    public static final int IFICMPGE = 162;
221    public static final int IFICMPGT = 163;
222    public static final int IFICMPLE = 164;
223    public static final int IFACMPEQ = 165;
224    public static final int IFACMPNE = 166;
225    public static final int GOTO = 167;
226    public static final int JSR = 168;
227    public static final int RET = 169;
228    public static final int TABLESWITCH = 170;
229    public static final int LOOKUPSWITCH = 171;
230    public static final int IRETURN = 172;
231    public static final int LRETURN = 173;
232    public static final int FRETURN = 174;
233    public static final int DRETURN = 175;
234    public static final int ARETURN = 176;
235    public static final int RETURN = 177;
236    public static final int GETSTATIC = 178;
237    public static final int PUTSTATIC = 179;
238    public static final int GETFIELD = 180;
239    public static final int PUTFIELD = 181;
240    public static final int INVOKEVIRTUAL = 182;
241    public static final int INVOKESPECIAL = 183;
242    public static final int INVOKESTATIC = 184;
243    public static final int INVOKEINTERFACE = 185;
244    public static final int NEW = 187;
245    public static final int NEWARRAY = 188;
246    public static final int ANEWARRAY = 189;
247    public static final int ARRAYLENGTH = 190;
248    public static final int ATHROW = 191;
249    public static final int CHECKCAST = 192;
250    public static final int INSTANCEOF = 193;
251    public static final int MONITORENTER = 194;
252    public static final int MONITOREXIT = 195;
253    public static final int WIDE = 196;
254    public static final int MULTIANEWARRAY = 197;
255    public static final int IFNULL = 198;
256    public static final int IFNONNULL = 199;
257    public static final int GOTOW = 200;
258    public static final int JSRW = 201;
259
260    // array types
261    public static final int ARRAY_BOOLEAN = 4;
262    public static final int ARRAY_CHAR = 5;
263    public static final int ARRAY_FLOAT = 6;
264    public static final int ARRAY_DOUBLE = 7;
265    public static final int ARRAY_BYTE = 8;
266    public static final int ARRAY_SHORT = 9;
267    public static final int ARRAY_INT = 10;
268    public static final int ARRAY_LONG = 11;
269
270    // math operations
271    public static final int MATH_ADD = IADD;
272    public static final int MATH_SUB = ISUB;
273    public static final int MATH_MUL = IMUL;
274    public static final int MATH_DIV = IDIV;
275    public static final int MATH_REM = IREM;
276    public static final int MATH_NEG = INEG;
277    public static final int MATH_SHL = ISHL;
278    public static final int MATH_SHR = ISHR;
279    public static final int MATH_USHR = IUSHR;
280    public static final int MATH_AND = IAND;
281    public static final int MATH_OR = IOR;
282    public static final int MATH_XOR = IXOR;
283
284    // human-readable opcode names
285    public static final String[] OPCODE_NAMES = new String[] {
286        "nop", "aconstnull", "iconstm1", "iconst0", "iconst1", "iconst2",
287        "iconst3", "iconst4", "iconst5", "lconst0", "lconst1", "fconst0",
288        "fconst1", "fconst2", "dconst0", "dconst1", "bipush", "sipush",
289        "ldc", "ldcw", "ldc2w", "iload", "lload", "fload", "dload", "aload",
290        "iload0", "iload1", "iload2", "iload3", "lload0", "lload1", "lload2",
291        "lload3", "fload0", "fload1", "fload2", "fload3", "dload0", "dload1",
292        "dload2", "dload3", "aload0", "aload1", "aload2", "aload3", "iaload",
293        "laload", "faload", "daload", "aaload", "baload", "caload", "saload",
294        "istore", "lstore", "fstore", "dstore", "astore", "istore0",
295        "istore1", "istore2", "istore3", "lstore0", "lstore1", "lstore2",
296        "lstore3", "fstore0", "fstore1", "fstore2", "fstore3", "dstore0",
297        "dstore1", "dstore2", "dstore3", "astore0", "astore1", "astore2",
298        "astore3", "iastore", "lastore", "fastore", "dastore", "aastore",
299        "bastore", "castore", "sastore", "pop", "pop2", "dup", "dupx1",
300        "dupx2", "dup2", "dup2x1", "dup2x2", "swap", "iadd", "ladd", "fadd",
301        "dadd", "isub", "lsub", "fsub", "dsub", "imul", "lmul", "fmul",
302        "dmul", "idiv", "ldiv", "fdiv", "ddiv", "irem", "lrem", "frem",
303        "drem", "ineg", "lneg", "fneg", "dneg", "ishl", "lshl", "ishr",
304        "lshr", "iushr", "lushr", "iand", "land", "ior", "lor", "ixor",
305        "lxor", "iinc", "i2l", "i2f", "i2d", "l2i", "l2f", "l2d", "f2i",
306        "f2l", "f2d", "d2i", "d2l", "d2f", "i2b", "i2c", "i2s", "lcmp",
307        "fcmpl", "fcmpg", "dcmpl", "dcmpg", "ifeq", "ifne", "iflt", "ifge",
308        "ifgt", "ifle", "ificmpeq", "ificmpne", "ificmplt", "ificmpge",
309        "ificmpgt", "ificmple", "ifacmpeq", "ifacmpne", "goto", "jsr", "ret",
310        "tableswitch", "lookupswitch", "ireturn", "lreturn", "freturn",
311        "dreturn", "areturn", "return", "getstatic", "putstatic", "getfield",
312        "putfield", "invokevirtual", "invokespecial", "invokestatic",
313        "invokeinterface", "??", "new", "newarray", "anewarray",
314        "arraylength", "athrow", "checkcast", "instanceof", "monitorenter",
315        "monitorexit", "wide", "multianewarray", "ifnull", "ifnonnull",
316        "gotow", "jsrw",
317    };
318}