001    package 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     */
011    public 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    }