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}