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 
Constants()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 }
512