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 }