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