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 = 
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    }