1/* 2 * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26package com.sun.java.util.jar.pack; 27 28import java.util.Arrays; 29import java.util.List; 30 31/** 32 * Shared constants 33 * @author John Rose 34 */ 35class Constants { 36 37 private Constants(){} 38 39 public static final int JAVA_MAGIC = 0xCAFEBABE; 40 41 /* 42 Java Class Version numbers history 43 1.0 to 1.3.X 45,3 44 1.4 to 1.4.X 46,0 45 1.5 to 1.5.X 49,0 46 1.6 to 1.6.X 50,0 47 1.7 to 1.7.X 51,0 48 1.8 to 1.8.X 52,0 49 1.9 to 1.9.X 53,0 50 */ 51 52 public static final Package.Version JAVA_MIN_CLASS_VERSION = 53 Package.Version.of(45, 03); 54 55 public static final Package.Version JAVA5_MAX_CLASS_VERSION = 56 Package.Version.of(49, 00); 57 58 public static final Package.Version JAVA6_MAX_CLASS_VERSION = 59 Package.Version.of(50, 00); 60 61 public static final Package.Version JAVA7_MAX_CLASS_VERSION = 62 Package.Version.of(51, 00); 63 64 public static final Package.Version JAVA8_MAX_CLASS_VERSION = 65 Package.Version.of(52, 00); 66 67 public static final Package.Version JAVA9_MAX_CLASS_VERSION = 68 Package.Version.of(53, 00); 69 70 public static final int JAVA_PACKAGE_MAGIC = 0xCAFED00D; 71 72 public static final Package.Version JAVA5_PACKAGE_VERSION = 73 Package.Version.of(150, 7); 74 75 public static final Package.Version JAVA6_PACKAGE_VERSION = 76 Package.Version.of(160, 1); 77 78 public static final Package.Version JAVA7_PACKAGE_VERSION = 79 Package.Version.of(170, 1); 80 81 public static final Package.Version JAVA8_PACKAGE_VERSION = 82 Package.Version.of(171, 0); 83 84 // upper limit, should point to the latest class version 85 public static final Package.Version JAVA_MAX_CLASS_VERSION = 86 JAVA9_MAX_CLASS_VERSION; 87 88 // upper limit should point to the latest package version, for version info!. 89 public static final Package.Version MAX_PACKAGE_VERSION = 90 JAVA7_PACKAGE_VERSION; 91 92 public static final int CONSTANT_POOL_INDEX_LIMIT = 0x10000; 93 public static final int CONSTANT_POOL_NARROW_LIMIT = 0x00100; 94 95 public static final String JAVA_SIGNATURE_CHARS = "BSCIJFDZLV(["; 96 97 public static final byte CONSTANT_Utf8 = 1; 98 public static final byte CONSTANT_unused2 = 2; // unused, was Unicode 99 public static final byte CONSTANT_Integer = 3; 100 public static final byte CONSTANT_Float = 4; 101 public static final byte CONSTANT_Long = 5; 102 public static final byte CONSTANT_Double = 6; 103 public static final byte CONSTANT_Class = 7; 104 public static final byte CONSTANT_String = 8; 105 public static final byte CONSTANT_Fieldref = 9; 106 public static final byte CONSTANT_Methodref = 10; 107 public static final byte CONSTANT_InterfaceMethodref = 11; 108 public static final byte CONSTANT_NameandType = 12; 109 public static final byte CONSTANT_unused13 = 13; 110 public static final byte CONSTANT_unused14 = 14; 111 public static final byte CONSTANT_MethodHandle = 15; 112 public static final byte CONSTANT_MethodType = 16; 113 public static final byte CONSTANT_unused17 = 17; // unused 114 public static final byte CONSTANT_InvokeDynamic = 18; 115 116 // pseudo-constants: 117 public static final byte CONSTANT_None = 0; 118 public static final byte CONSTANT_Signature = CONSTANT_unused13; 119 public static final byte CONSTANT_BootstrapMethod = CONSTANT_unused17; // used only in InvokeDynamic constants 120 public static final byte CONSTANT_Limit = 19; 121 122 public static final byte CONSTANT_All = 50; // combined global map 123 public static final byte CONSTANT_LoadableValue = 51; // used for 'KL' and qldc operands 124 public static final byte CONSTANT_AnyMember = 52; // union of refs to field or (interface) method 125 public static final byte CONSTANT_FieldSpecific = 53; // used only for 'KQ' ConstantValue attrs 126 public static final byte CONSTANT_GroupFirst = CONSTANT_All; 127 public static final byte CONSTANT_GroupLimit = CONSTANT_FieldSpecific+1; 128 129 // CONSTANT_MethodHandle reference kinds 130 public static final byte REF_getField = 1; 131 public static final byte REF_getStatic = 2; 132 public static final byte REF_putField = 3; 133 public static final byte REF_putStatic = 4; 134 public static final byte REF_invokeVirtual = 5; 135 public static final byte REF_invokeStatic = 6; 136 public static final byte REF_invokeSpecial = 7; 137 public static final byte REF_newInvokeSpecial = 8; 138 public static final byte REF_invokeInterface = 9; 139 140 // pseudo-access bits 141 public static final int ACC_IC_LONG_FORM = (1<<16); //for ic_flags 142 143 // attribute "context types" 144 public static final int ATTR_CONTEXT_CLASS = 0; 145 public static final int ATTR_CONTEXT_FIELD = 1; 146 public static final int ATTR_CONTEXT_METHOD = 2; 147 public static final int ATTR_CONTEXT_CODE = 3; 148 public static final int ATTR_CONTEXT_LIMIT = 4; 149 public static final String[] ATTR_CONTEXT_NAME 150 = { "class", "field", "method", "code" }; 151 152 // predefined attr bits 153 public static final int 154 X_ATTR_OVERFLOW = 16, 155 CLASS_ATTR_SourceFile = 17, 156 METHOD_ATTR_Code = 17, 157 FIELD_ATTR_ConstantValue = 17, 158 CLASS_ATTR_EnclosingMethod = 18, 159 METHOD_ATTR_Exceptions = 18, 160 X_ATTR_Signature = 19, 161 X_ATTR_Deprecated = 20, 162 X_ATTR_RuntimeVisibleAnnotations = 21, 163 X_ATTR_RuntimeInvisibleAnnotations = 22, 164 METHOD_ATTR_RuntimeVisibleParameterAnnotations = 23, 165 CLASS_ATTR_InnerClasses = 23, 166 METHOD_ATTR_RuntimeInvisibleParameterAnnotations = 24, 167 CLASS_ATTR_ClassFile_version = 24, 168 METHOD_ATTR_AnnotationDefault = 25, 169 METHOD_ATTR_MethodParameters = 26, // JDK8 170 X_ATTR_RuntimeVisibleTypeAnnotations = 27, // JDK8 171 X_ATTR_RuntimeInvisibleTypeAnnotations = 28, // JDK8 172 CODE_ATTR_StackMapTable = 0, // new in Java 6 173 CODE_ATTR_LineNumberTable = 1, 174 CODE_ATTR_LocalVariableTable = 2, 175 CODE_ATTR_LocalVariableTypeTable = 3; 176 177 // File option bits, from LSB in ascending bit position. 178 public static final int FO_DEFLATE_HINT = 1<<0; 179 public static final int FO_IS_CLASS_STUB = 1<<1; 180 181 // Archive option bits, from LSB in ascending bit position: 182 public static final int AO_HAVE_SPECIAL_FORMATS = 1<<0; 183 public static final int AO_HAVE_CP_NUMBERS = 1<<1; 184 public static final int AO_HAVE_ALL_CODE_FLAGS = 1<<2; 185 public static final int AO_HAVE_CP_EXTRAS = 1<<3; 186 public static final int AO_HAVE_FILE_HEADERS = 1<<4; 187 public static final int AO_DEFLATE_HINT = 1<<5; 188 public static final int AO_HAVE_FILE_MODTIME = 1<<6; 189 public static final int AO_HAVE_FILE_OPTIONS = 1<<7; 190 public static final int AO_HAVE_FILE_SIZE_HI = 1<<8; 191 public static final int AO_HAVE_CLASS_FLAGS_HI = 1<<9; 192 public static final int AO_HAVE_FIELD_FLAGS_HI = 1<<10; 193 public static final int AO_HAVE_METHOD_FLAGS_HI = 1<<11; 194 public static final int AO_HAVE_CODE_FLAGS_HI = 1<<12; 195 public static final int AO_UNUSED_MBZ = (-1)<<13; // option bits reserved for future use 196 197 public static final int LG_AO_HAVE_XXX_FLAGS_HI = 9; 198 199 // visitRefs modes: 200 static final int VRM_CLASSIC = 0; 201 static final int VRM_PACKAGE = 1; 202 203 public static final int NO_MODTIME = 0; // null modtime value 204 205 // some comstantly empty containers 206 public static final int[] noInts = {}; 207 public static final byte[] noBytes = {}; 208 public static final Object[] noValues = {}; 209 public static final String[] noStrings = {}; 210 public static final List<Object> emptyList = Arrays.asList(noValues); 211 212 // meta-coding 213 public static final int 214 _meta_default = 0, 215 _meta_canon_min = 1, 216 _meta_canon_max = 115, 217 _meta_arb = 116, 218 _meta_run = 117, 219 _meta_pop = 141, 220 _meta_limit = 189; 221 222 // bytecodes 223 public static final int 224 _nop = 0, // 0x00 225 _aconst_null = 1, // 0x01 226 _iconst_m1 = 2, // 0x02 227 _iconst_0 = 3, // 0x03 228 _iconst_1 = 4, // 0x04 229 _iconst_2 = 5, // 0x05 230 _iconst_3 = 6, // 0x06 231 _iconst_4 = 7, // 0x07 232 _iconst_5 = 8, // 0x08 233 _lconst_0 = 9, // 0x09 234 _lconst_1 = 10, // 0x0a 235 _fconst_0 = 11, // 0x0b 236 _fconst_1 = 12, // 0x0c 237 _fconst_2 = 13, // 0x0d 238 _dconst_0 = 14, // 0x0e 239 _dconst_1 = 15, // 0x0f 240 _bipush = 16, // 0x10 241 _sipush = 17, // 0x11 242 _ldc = 18, // 0x12 243 _ldc_w = 19, // 0x13 244 _ldc2_w = 20, // 0x14 245 _iload = 21, // 0x15 246 _lload = 22, // 0x16 247 _fload = 23, // 0x17 248 _dload = 24, // 0x18 249 _aload = 25, // 0x19 250 _iload_0 = 26, // 0x1a 251 _iload_1 = 27, // 0x1b 252 _iload_2 = 28, // 0x1c 253 _iload_3 = 29, // 0x1d 254 _lload_0 = 30, // 0x1e 255 _lload_1 = 31, // 0x1f 256 _lload_2 = 32, // 0x20 257 _lload_3 = 33, // 0x21 258 _fload_0 = 34, // 0x22 259 _fload_1 = 35, // 0x23 260 _fload_2 = 36, // 0x24 261 _fload_3 = 37, // 0x25 262 _dload_0 = 38, // 0x26 263 _dload_1 = 39, // 0x27 264 _dload_2 = 40, // 0x28 265 _dload_3 = 41, // 0x29 266 _aload_0 = 42, // 0x2a 267 _aload_1 = 43, // 0x2b 268 _aload_2 = 44, // 0x2c 269 _aload_3 = 45, // 0x2d 270 _iaload = 46, // 0x2e 271 _laload = 47, // 0x2f 272 _faload = 48, // 0x30 273 _daload = 49, // 0x31 274 _aaload = 50, // 0x32 275 _baload = 51, // 0x33 276 _caload = 52, // 0x34 277 _saload = 53, // 0x35 278 _istore = 54, // 0x36 279 _lstore = 55, // 0x37 280 _fstore = 56, // 0x38 281 _dstore = 57, // 0x39 282 _astore = 58, // 0x3a 283 _istore_0 = 59, // 0x3b 284 _istore_1 = 60, // 0x3c 285 _istore_2 = 61, // 0x3d 286 _istore_3 = 62, // 0x3e 287 _lstore_0 = 63, // 0x3f 288 _lstore_1 = 64, // 0x40 289 _lstore_2 = 65, // 0x41 290 _lstore_3 = 66, // 0x42 291 _fstore_0 = 67, // 0x43 292 _fstore_1 = 68, // 0x44 293 _fstore_2 = 69, // 0x45 294 _fstore_3 = 70, // 0x46 295 _dstore_0 = 71, // 0x47 296 _dstore_1 = 72, // 0x48 297 _dstore_2 = 73, // 0x49 298 _dstore_3 = 74, // 0x4a 299 _astore_0 = 75, // 0x4b 300 _astore_1 = 76, // 0x4c 301 _astore_2 = 77, // 0x4d 302 _astore_3 = 78, // 0x4e 303 _iastore = 79, // 0x4f 304 _lastore = 80, // 0x50 305 _fastore = 81, // 0x51 306 _dastore = 82, // 0x52 307 _aastore = 83, // 0x53 308 _bastore = 84, // 0x54 309 _castore = 85, // 0x55 310 _sastore = 86, // 0x56 311 _pop = 87, // 0x57 312 _pop2 = 88, // 0x58 313 _dup = 89, // 0x59 314 _dup_x1 = 90, // 0x5a 315 _dup_x2 = 91, // 0x5b 316 _dup2 = 92, // 0x5c 317 _dup2_x1 = 93, // 0x5d 318 _dup2_x2 = 94, // 0x5e 319 _swap = 95, // 0x5f 320 _iadd = 96, // 0x60 321 _ladd = 97, // 0x61 322 _fadd = 98, // 0x62 323 _dadd = 99, // 0x63 324 _isub = 100, // 0x64 325 _lsub = 101, // 0x65 326 _fsub = 102, // 0x66 327 _dsub = 103, // 0x67 328 _imul = 104, // 0x68 329 _lmul = 105, // 0x69 330 _fmul = 106, // 0x6a 331 _dmul = 107, // 0x6b 332 _idiv = 108, // 0x6c 333 _ldiv = 109, // 0x6d 334 _fdiv = 110, // 0x6e 335 _ddiv = 111, // 0x6f 336 _irem = 112, // 0x70 337 _lrem = 113, // 0x71 338 _frem = 114, // 0x72 339 _drem = 115, // 0x73 340 _ineg = 116, // 0x74 341 _lneg = 117, // 0x75 342 _fneg = 118, // 0x76 343 _dneg = 119, // 0x77 344 _ishl = 120, // 0x78 345 _lshl = 121, // 0x79 346 _ishr = 122, // 0x7a 347 _lshr = 123, // 0x7b 348 _iushr = 124, // 0x7c 349 _lushr = 125, // 0x7d 350 _iand = 126, // 0x7e 351 _land = 127, // 0x7f 352 _ior = 128, // 0x80 353 _lor = 129, // 0x81 354 _ixor = 130, // 0x82 355 _lxor = 131, // 0x83 356 _iinc = 132, // 0x84 357 _i2l = 133, // 0x85 358 _i2f = 134, // 0x86 359 _i2d = 135, // 0x87 360 _l2i = 136, // 0x88 361 _l2f = 137, // 0x89 362 _l2d = 138, // 0x8a 363 _f2i = 139, // 0x8b 364 _f2l = 140, // 0x8c 365 _f2d = 141, // 0x8d 366 _d2i = 142, // 0x8e 367 _d2l = 143, // 0x8f 368 _d2f = 144, // 0x90 369 _i2b = 145, // 0x91 370 _i2c = 146, // 0x92 371 _i2s = 147, // 0x93 372 _lcmp = 148, // 0x94 373 _fcmpl = 149, // 0x95 374 _fcmpg = 150, // 0x96 375 _dcmpl = 151, // 0x97 376 _dcmpg = 152, // 0x98 377 _ifeq = 153, // 0x99 378 _ifne = 154, // 0x9a 379 _iflt = 155, // 0x9b 380 _ifge = 156, // 0x9c 381 _ifgt = 157, // 0x9d 382 _ifle = 158, // 0x9e 383 _if_icmpeq = 159, // 0x9f 384 _if_icmpne = 160, // 0xa0 385 _if_icmplt = 161, // 0xa1 386 _if_icmpge = 162, // 0xa2 387 _if_icmpgt = 163, // 0xa3 388 _if_icmple = 164, // 0xa4 389 _if_acmpeq = 165, // 0xa5 390 _if_acmpne = 166, // 0xa6 391 _goto = 167, // 0xa7 392 _jsr = 168, // 0xa8 393 _ret = 169, // 0xa9 394 _tableswitch = 170, // 0xaa 395 _lookupswitch = 171, // 0xab 396 _ireturn = 172, // 0xac 397 _lreturn = 173, // 0xad 398 _freturn = 174, // 0xae 399 _dreturn = 175, // 0xaf 400 _areturn = 176, // 0xb0 401 _return = 177, // 0xb1 402 _getstatic = 178, // 0xb2 403 _putstatic = 179, // 0xb3 404 _getfield = 180, // 0xb4 405 _putfield = 181, // 0xb5 406 _invokevirtual = 182, // 0xb6 407 _invokespecial = 183, // 0xb7 408 _invokestatic = 184, // 0xb8 409 _invokeinterface = 185, // 0xb9 410 _invokedynamic = 186, // 0xba 411 _new = 187, // 0xbb 412 _newarray = 188, // 0xbc 413 _anewarray = 189, // 0xbd 414 _arraylength = 190, // 0xbe 415 _athrow = 191, // 0xbf 416 _checkcast = 192, // 0xc0 417 _instanceof = 193, // 0xc1 418 _monitorenter = 194, // 0xc2 419 _monitorexit = 195, // 0xc3 420 _wide = 196, // 0xc4 421 _multianewarray = 197, // 0xc5 422 _ifnull = 198, // 0xc6 423 _ifnonnull = 199, // 0xc7 424 _goto_w = 200, // 0xc8 425 _jsr_w = 201, // 0xc9 426 _bytecode_limit = 202; // 0xca 427 428 // End marker, used to terminate bytecode sequences: 429 public static final int _end_marker = 255; 430 // Escapes: 431 public static final int _byte_escape = 254; 432 public static final int _ref_escape = 253; 433 434 // Self-relative pseudo-opcodes for better compression. 435 // A "linker op" is a bytecode which links to a class member. 436 // (But in what follows, "invokeinterface" ops are excluded.) 437 // 438 // A "self linker op" is a variant bytecode which works only 439 // with the current class or its super. Because the number of 440 // possible targets is small, it admits a more compact encoding. 441 // Self linker ops are allowed to absorb a previous "aload_0" op. 442 // There are (7 * 4) self linker ops (super or not, aload_0 or not). 443 // 444 // For simplicity, we define the full symmetric set of variants. 445 // However, some of them are relatively useless. 446 // Self linker ops are enabled by Pack.selfCallVariants (true). 447 public static final int _first_linker_op = _getstatic; 448 public static final int _last_linker_op = _invokestatic; 449 public static final int _num_linker_ops = (_last_linker_op - _first_linker_op) + 1; 450 public static final int _self_linker_op = _bytecode_limit; 451 public static final int _self_linker_aload_flag = 1*_num_linker_ops; 452 public static final int _self_linker_super_flag = 2*_num_linker_ops; 453 public static final int _self_linker_limit = _self_linker_op + 4*_num_linker_ops; 454 // An "invoke init" op is a variant of invokespecial which works 455 // only with the method name "<init>". There are variants which 456 // link to the current class, the super class, or the class of the 457 // immediately previous "newinstance" op. There are 3 of these ops. 458 // They all take method signature references as operands. 459 // Invoke init ops are enabled by Pack.initCallVariants (true). 460 public static final int _invokeinit_op = _self_linker_limit; 461 public static final int _invokeinit_self_option = 0; 462 public static final int _invokeinit_super_option = 1; 463 public static final int _invokeinit_new_option = 2; 464 public static final int _invokeinit_limit = _invokeinit_op+3; 465 466 public static final int _pseudo_instruction_limit = _invokeinit_limit; 467 // linker variant limit == 202+(7*4)+3 == 233 468 469 // Ldc variants support strongly typed references to constants. 470 // This lets us index constant pool entries completely according to tag, 471 // which is a great simplification. 472 // Ldc variants gain us only 0.007% improvement in compression ratio, 473 // but they simplify the file format greatly. 474 public static final int _xldc_op = _invokeinit_limit; 475 public static final int _sldc = _ldc; // previously named _aldc 476 public static final int _cldc = _xldc_op+0; 477 public static final int _ildc = _xldc_op+1; 478 public static final int _fldc = _xldc_op+2; 479 public static final int _sldc_w = _ldc_w; // previously named _aldc_w 480 public static final int _cldc_w = _xldc_op+3; 481 public static final int _ildc_w = _xldc_op+4; 482 public static final int _fldc_w = _xldc_op+5; 483 public static final int _lldc2_w = _ldc2_w; 484 public static final int _dldc2_w = _xldc_op+6; 485 // anything other than primitive, string, or class must be handled with qldc: 486 public static final int _qldc = _xldc_op+7; 487 public static final int _qldc_w = _xldc_op+8; 488 public static final int _xldc_limit = _xldc_op+9; 489 490 // handling of InterfaceMethodRef 491 public static final int _invoke_int_op = _xldc_limit; 492 public static final int _invokespecial_int = _invoke_int_op+0; 493 public static final int _invokestatic_int = _invoke_int_op+1; 494 public static final int _invoke_int_limit = _invoke_int_op+2; 495} 496