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