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