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