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 
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     */
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 }
504