1 /*
2  * Copyright (c) 1994, 2004, 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 
27 package sun.tools.java;
28 
29 /**
30  * This interface defines constant that are used
31  * throughout the compiler. It inherits from RuntimeConstants,
32  * which is an autogenerated class that contains contstants
33  * defined in the interpreter.
34  *
35  * WARNING: The contents of this source file are not part of any
36  * supported API.  Code that depends on them does so at its own risk:
37  * they are subject to change or removal without notice.
38  *
39  * @author      Arthur van Hoff
40  */
41 
42 public
43 interface Constants extends RuntimeConstants {
44 
45     /*
46      * Enable/disable inclusion of certain debug tracing code in the
47      * compiler.  When included, the tracing code may be selectively
48      * enabled at runtime, otherwise we save the space/time overhead.
49      * Should normally be 'false' for a release version.
50      */
51     public static final boolean tracing = true;
52 
53     /*
54      * Frequently used identifiers
55      */
56     Identifier idAppend = Identifier.lookup("append");
57     Identifier idClassInit = Identifier.lookup("<clinit>");
58     Identifier idCode = Identifier.lookup("Code");
59     Identifier idInit = Identifier.lookup("<init>");
60     Identifier idLength = Identifier.lookup("length");
61     Identifier idNull = Identifier.lookup("");
62     Identifier idStar = Identifier.lookup("*");
63     Identifier idSuper = Identifier.lookup("super");
64     Identifier idThis = Identifier.lookup("this");
65     Identifier idClass = Identifier.lookup("class");
66     Identifier idToString = Identifier.lookup("toString");
67     Identifier idValueOf = Identifier.lookup("valueOf");
68     Identifier idNew = Identifier.lookup("new");
69     Identifier idGetClass = Identifier.lookup("getClass");
70     Identifier idTYPE = Identifier.lookup("TYPE");
71     Identifier idFinallyReturnValue = Identifier.lookup("<return>");
72 
73     Identifier idJavaLang = Identifier.lookup("java.lang");
74 
75     Identifier idJavaLangCloneable = Identifier.lookup("java.lang.Cloneable");
76 
77     Identifier idJavaLangError = Identifier.lookup("java.lang.Error");
78     Identifier idJavaLangException = Identifier.lookup("java.lang.Exception");
79     Identifier idJavaLangObject = Identifier.lookup("java.lang.Object");
80     Identifier idJavaLangClass = Identifier.lookup("java.lang.Class");
81     Identifier idJavaLangRuntimeException =
82           Identifier.lookup("java.lang.RuntimeException");
83     Identifier idJavaLangString = Identifier.lookup("java.lang.String");
84     Identifier idJavaLangStringBuffer =
85           Identifier.lookup("java.lang.StringBuffer");
86     Identifier idJavaLangThrowable = Identifier.lookup("java.lang.Throwable");
87 
88     Identifier idJavaIoSerializable = Identifier.lookup("java.io.Serializable");
89 
90 
91     Identifier idConstantValue = Identifier.lookup("ConstantValue");
92     Identifier idLocalVariableTable = Identifier.lookup("LocalVariableTable");
93     Identifier idLineNumberTable = Identifier.lookup("LineNumberTable");
94 // JCOV
95     Identifier idCoverageTable = Identifier.lookup("CoverageTable");
96 // end JCOV
97     Identifier idSourceFile = Identifier.lookup("SourceFile");
98     Identifier idDocumentation = Identifier.lookup("Documentation");
99     Identifier idDeprecated = Identifier.lookup("Deprecated");
100     Identifier idSynthetic = Identifier.lookup("Synthetic");
101     Identifier idExceptions = Identifier.lookup("Exceptions");
102     Identifier idInnerClasses = Identifier.lookup("InnerClasses");
103 
104     /* methods we need to know about */
105     Identifier idClone = Identifier.lookup("clone");
106 
107 
108     /* This is not a real signature marker, since it is also
109      * an identifier constituent character.
110      */
111     char   SIGC_INNERCLASS      = '$';
112     String SIG_INNERCLASS       = "$";
113 
114     String prefixThis           = "this$";
115     String prefixVal            = "val$";
116     String prefixLoc            = "loc$";
117     String prefixAccess         = "access$";
118     String prefixClass          = "class$";
119     String prefixArray          = "array$";
120 
121     /*
122      * Flags
123      */
124     int F_VERBOSE               = 1 << 0;
125     int F_DUMP                  = 1 << 1;
126     int F_WARNINGS              = 1 << 2;
127 
128     // The meaning of -g has changed, so F_DEBUG flag is removed.
129     // public static final int F_DEBUG          = 1 << 3;
130     int F_DEBUG_LINES           = 1 << 12;
131     int F_DEBUG_VARS            = 1 << 13;
132     int F_DEBUG_SOURCE          = 1 << 18;
133 
134     // The meaning of -O has changed, so F_OPTIMIZE flag is removed.
135     // public static final int F_OPTIMIZE       = 1 << 4;
136     int F_OPT                   = 1 << 14;
137     int F_OPT_INTERCLASS        = 1 << 15;
138 
139     int F_DEPENDENCIES          = 1 << 5;
140 
141 // JCOV
142     int F_COVERAGE              = 1 << 6;
143     int F_COVDATA               = 1 << 7;
144 // end JCOV
145 
146     int F_DEPRECATION           = 1 << 9;
147     int F_PRINT_DEPENDENCIES    = 1 << 10;
148     int F_VERSION12             = 1 << 11;
149 
150 
151     int F_ERRORSREPORTED        = 1 << 16;
152 
153     int F_STRICTDEFAULT         = 1 << 17;
154 
155     /*
156      * Modifiers.
157      *
158      * There has been much confusion regarding modifiers.  There
159      * are a number of distinct usages:
160      *
161      *    - in classfiles to annotate classes, as per JVM pg. 102.
162      *    - in classfiles to annotate methods, as per JVM pg. 104.
163      *    - in classfiles to annotate InnerClass attributes, as per
164      *          http://java.sun.com/products/jdk/1.1/docs/guide/innerclasses
165      *    - in the compiler to record java source level modifiers,
166      *          as per JLS pg. 157 et al., plus misc. info such as whether
167      *          a method is deprecated
168      *    - in the JVM to record misc. info, such as whether a method has
169      *          has been compiled
170      *
171      * To make matters worse, the terms "access flags" and "modifiers"
172      * are often used interchangably, and some information that might
173      * make sense as a flag is expressed using attributes (ie. Synthetic).
174      *
175      * The constants defined herein have been divided by whether they
176      * make sense only within the compiler (M_* and MM_*) or whether
177      * they only make sense to the JVM (ACC_* and ACCM_*).  At an earlier
178      * time these were all lumped together.  Future maintenance should
179      * strive to keep the distinction clear.
180      *
181      * Note that modifier M_STRICTFP is not in general recoverable from
182      * the ACC_STRICT bit in classfiles.
183      *
184      * Note also that the modifiers M_LOCAL and M_ANONYMOUS do not appear
185      * in the InnerClass attribute, as they are above the first 16 bits.
186      */
187 
188     // Modifiers meaningful to both Java source and the JVM.  These
189     // have been kept the same bit in the M_* and ACC_* forms
190     // to avoid destabilizing the compiler.
191     int M_PUBLIC                = ACC_PUBLIC;
192     int M_PRIVATE               = ACC_PRIVATE;
193     int M_PROTECTED             = ACC_PROTECTED;
194     int M_STATIC                = ACC_STATIC;
195     int M_TRANSIENT             = ACC_TRANSIENT;
196     int M_SYNCHRONIZED          = ACC_SYNCHRONIZED; // collides with ACC_SUPER
197     int M_ABSTRACT              = ACC_ABSTRACT;
198     int M_NATIVE                = ACC_NATIVE;
199     int M_FINAL                 = ACC_FINAL;
200     int M_VOLATILE              = ACC_VOLATILE;
201     int M_INTERFACE             = ACC_INTERFACE;
202 
203     // Modifiers not meaningful to the JVM.  The JVM only allows 16 bits
204     // for modifiers, so keeping these in the unusable bits after the first
205     // 16 is a good idea.
206     int M_ANONYMOUS             = 0x00010000;
207     int M_LOCAL                 = 0x00020000;
208     int M_DEPRECATED            = 0x00040000;
209     int M_SYNTHETIC             = 0x00080000;
210     int M_INLINEABLE            = 0x00100000;
211 
212     int M_STRICTFP              = 0x00200000;
213 
214     String paraDeprecated       = "@deprecated";
215 
216     // Masks for modifiers that apply to Java source code
217     int MM_CLASS  = M_PUBLIC
218                         | M_INTERFACE
219                         | M_FINAL
220                         | M_ABSTRACT
221                         | M_STRICTFP;
222     int MM_MEMBER = M_PUBLIC
223                         | M_PRIVATE
224                         | M_PROTECTED
225                         | M_FINAL
226                         | M_STATIC;
227     int MM_FIELD  = MM_MEMBER
228                         | M_TRANSIENT
229                         | M_VOLATILE;
230     int MM_METHOD = MM_MEMBER
231                         | M_SYNCHRONIZED
232                         | M_ABSTRACT
233                         | M_NATIVE
234                         | M_STRICTFP;
235 
236     // Masks for modifiers that apply to class files.
237     // Note that the M_SYNTHETIC modifier is never written out to a class file.
238     // Synthetic members are indicated using the "Synthetic" attribute.
239     int ACCM_CLASS  = ACC_PUBLIC
240                         | ACC_INTERFACE
241                         | ACC_FINAL
242                         | ACC_ABSTRACT
243                         | ACC_SUPER
244                         | ACC_STRICT;
245     int ACCM_MEMBER = ACC_PUBLIC
246                         | ACC_PRIVATE
247                         | ACC_PROTECTED
248                         | ACC_FINAL
249                         | ACC_STATIC;
250     // The M_ANONYMOUS and M_LOCAL modifiers are not mentioned in the
251     // inner classes specification and are never written to classfiles.
252     // Also note that ACC_SUPER should never be set in an InnerClass
253     // attribute.
254     int ACCM_INNERCLASS = ACC_PUBLIC
255                         | ACC_PRIVATE
256                         | ACC_PROTECTED
257                         | ACC_STATIC
258                         | ACC_ABSTRACT
259                         | ACC_FINAL
260                         | ACC_INTERFACE
261                         | ACC_STRICT;
262     int ACCM_FIELD  = ACCM_MEMBER
263                         | ACC_TRANSIENT
264                         | ACC_VOLATILE;
265     int ACCM_METHOD = ACCM_MEMBER
266                         | ACC_SYNCHRONIZED
267                         | ACC_ABSTRACT
268                         | ACC_NATIVE
269                         | ACC_STRICT;
270 
271     /*
272      * Type codes
273      */
274     int TC_BOOLEAN   = 0;
275     int TC_BYTE      = 1;
276     int TC_CHAR      = 2;
277     int TC_SHORT     = 3;
278     int TC_INT       = 4;
279     int TC_LONG      = 5;
280     int TC_FLOAT     = 6;
281     int TC_DOUBLE    = 7;
282     int TC_NULL      = 8;
283     int TC_ARRAY     = 9;
284     int TC_CLASS     = 10;
285     int TC_VOID      = 11;
286     int TC_METHOD    = 12;
287     int TC_ERROR     = 13;
288 
289 // JCOV
290     /*
291      * Cover's types
292      */
293     int CT_FIRST_KIND   = 1;
294     int CT_METHOD       = 1;
295     int CT_FIKT_METHOD  = 2;
296     int CT_BLOCK        = 3;
297     int CT_FIKT_RET     = 4;
298     int CT_CASE         = 5;
299     int CT_SWITH_WO_DEF = 6;
300     int CT_BRANCH_TRUE  = 7;
301     int CT_BRANCH_FALSE = 8;
302     int CT_LAST_KIND    = 8;
303 // end JCOV
304 
305     /*
306      * Type Masks
307      */
308     int TM_NULL      = 1 << TC_NULL;
309     int TM_VOID      = 1 << TC_VOID;
310     int TM_BOOLEAN   = 1 << TC_BOOLEAN;
311     int TM_BYTE      = 1 << TC_BYTE;
312     int TM_CHAR      = 1 << TC_CHAR;
313     int TM_SHORT     = 1 << TC_SHORT;
314     int TM_INT       = 1 << TC_INT;
315     int TM_LONG      = 1 << TC_LONG;
316     int TM_FLOAT     = 1 << TC_FLOAT;
317     int TM_DOUBLE    = 1 << TC_DOUBLE;
318     int TM_ARRAY     = 1 << TC_ARRAY;
319     int TM_CLASS     = 1 << TC_CLASS;
320     int TM_METHOD    = 1 << TC_METHOD;
321     int TM_ERROR     = 1 << TC_ERROR;
322 
323     int TM_INT32     = TM_BYTE | TM_SHORT | TM_CHAR | TM_INT;
324     int TM_NUM32     = TM_INT32 | TM_FLOAT;
325     int TM_NUM64     = TM_LONG | TM_DOUBLE;
326     int TM_INTEGER   = TM_INT32 | TM_LONG;
327     int TM_REAL      = TM_FLOAT | TM_DOUBLE;
328     int TM_NUMBER    = TM_INTEGER | TM_REAL;
329     int TM_REFERENCE = TM_ARRAY | TM_CLASS | TM_NULL;
330 
331     /*
332      * Class status
333      */
334     int CS_UNDEFINED    = 0;
335     int CS_UNDECIDED    = 1;
336     int CS_BINARY       = 2;
337     int CS_SOURCE       = 3;
338     int CS_PARSED       = 4;
339     int CS_CHECKED      = 5;
340     int CS_COMPILED     = 6;
341     int CS_NOTFOUND     = 7;
342 
343 
344     /*
345      * Attributes
346      */
347     int ATT_ALL         = 0xFFFFFFFF;
348     int ATT_CODE        = 1 << 1;
349     int ATT_ALLCLASSES  = 1 << 2;
350 
351     /*
352      * Number of bits used in file offsets.  The line number and
353      * file offset are concatenated into a long, with enough room
354      * for other information to be added later if desired (such as
355      * token lengths).  For the moment explicit bit manipulations
356      * are used to modify the fields.  This makes sense for efficiency
357      * but at some point these ought to be better encapsulated.
358      */
359     int WHEREOFFSETBITS = 32;
360     long MAXFILESIZE    = (1L << WHEREOFFSETBITS) - 1;
361     long MAXLINENUMBER  = (1L << (64 - WHEREOFFSETBITS)) - 1;
362 
363     /*
364      * Operators
365      */
366     int COMMA           = 0;
367     int ASSIGN          = 1;
368 
369     int ASGMUL          = 2;
370     int ASGDIV          = 3;
371     int ASGREM          = 4;
372     int ASGADD          = 5;
373     int ASGSUB          = 6;
374     int ASGLSHIFT       = 7;
375     int ASGRSHIFT       = 8;
376     int ASGURSHIFT      = 9;
377     int ASGBITAND       = 10;
378     int ASGBITOR        = 11;
379     int ASGBITXOR       = 12;
380 
381     int COND            = 13;
382     int OR              = 14;
383     int AND             = 15;
384     int BITOR           = 16;
385     int BITXOR          = 17;
386     int BITAND          = 18;
387     int NE              = 19;
388     int EQ              = 20;
389     int GE              = 21;
390     int GT              = 22;
391     int LE              = 23;
392     int LT              = 24;
393     int INSTANCEOF      = 25;
394     int LSHIFT          = 26;
395     int RSHIFT          = 27;
396     int URSHIFT         = 28;
397     int ADD             = 29;
398     int SUB             = 30;
399     int DIV             = 31;
400     int REM             = 32;
401     int MUL             = 33;
402     int CAST            = 34;           // (x)y
403     int POS             = 35;           // +x
404     int NEG             = 36;           // -x
405     int NOT             = 37;
406     int BITNOT          = 38;
407     int PREINC          = 39;           // ++x
408     int PREDEC          = 40;           // --x
409     int NEWARRAY        = 41;
410     int NEWINSTANCE     = 42;
411     int NEWFROMNAME     = 43;
412     int POSTINC         = 44;           // x++
413     int POSTDEC         = 45;           // x--
414     int FIELD           = 46;
415     int METHOD          = 47;           // x(y)
416     int ARRAYACCESS     = 48;           // x[y]
417     int NEW             = 49;
418     int INC             = 50;
419     int DEC             = 51;
420 
421     int CONVERT         = 55;           // implicit conversion
422     int EXPR            = 56;           // (x)
423     int ARRAY           = 57;           // {x, y, ...}
424     int GOTO            = 58;
425 
426     /*
427      * Value tokens
428      */
429     int IDENT           = 60;
430     int BOOLEANVAL      = 61;
431     int BYTEVAL         = 62;
432     int CHARVAL         = 63;
433     int SHORTVAL        = 64;
434     int INTVAL          = 65;
435     int LONGVAL         = 66;
436     int FLOATVAL        = 67;
437     int DOUBLEVAL       = 68;
438     int STRINGVAL       = 69;
439 
440     /*
441      * Type keywords
442      */
443     int BYTE            = 70;
444     int CHAR            = 71;
445     int SHORT           = 72;
446     int INT             = 73;
447     int LONG            = 74;
448     int FLOAT           = 75;
449     int DOUBLE          = 76;
450     int VOID            = 77;
451     int BOOLEAN         = 78;
452 
453     /*
454      * Expression keywords
455      */
456     int TRUE            = 80;
457     int FALSE           = 81;
458     int THIS            = 82;
459     int SUPER           = 83;
460     int NULL            = 84;
461 
462     /*
463      * Statement keywords
464      */
465     int IF              = 90;
466     int ELSE            = 91;
467     int FOR             = 92;
468     int WHILE           = 93;
469     int DO              = 94;
470     int SWITCH          = 95;
471     int CASE            = 96;
472     int DEFAULT         = 97;
473     int BREAK           = 98;
474     int CONTINUE        = 99;
475     int RETURN          = 100;
476     int TRY             = 101;
477     int CATCH           = 102;
478     int FINALLY         = 103;
479     int THROW           = 104;
480     int STAT            = 105;
481     int EXPRESSION      = 106;
482     int DECLARATION     = 107;
483     int VARDECLARATION  = 108;
484 
485     /*
486      * Declaration keywords
487      */
488     int IMPORT          = 110;
489     int CLASS           = 111;
490     int EXTENDS         = 112;
491     int IMPLEMENTS      = 113;
492     int INTERFACE       = 114;
493     int PACKAGE         = 115;
494 
495     /*
496      * Modifier keywords
497      */
498     int PRIVATE         = 120;
499     int PUBLIC          = 121;
500     int PROTECTED       = 122;
501     int CONST           = 123;
502     int STATIC          = 124;
503     int TRANSIENT       = 125;
504     int SYNCHRONIZED    = 126;
505     int NATIVE          = 127;
506     int FINAL           = 128;
507     int VOLATILE        = 129;
508     int ABSTRACT        = 130;
509     int STRICTFP        = 131;
510 
511     /*
512      * Punctuation
513      */
514     int SEMICOLON       = 135;
515     int COLON           = 136;
516     int QUESTIONMARK    = 137;
517     int LBRACE          = 138;
518     int RBRACE          = 139;
519     int LPAREN          = 140;
520     int RPAREN          = 141;
521     int LSQBRACKET      = 142;
522     int RSQBRACKET      = 143;
523     int THROWS          = 144;
524 
525     /*
526      * Special tokens
527      */
528     int ERROR           = 145;          // an error
529     int COMMENT         = 146;          // not used anymore.
530     int TYPE            = 147;
531     int LENGTH          = 148;
532     int INLINERETURN    = 149;
533     int INLINEMETHOD    = 150;
534     int INLINENEWINSTANCE       = 151;
535 
536     /*
537      * Operator precedence
538      */
539     int opPrecedence[] = {
540         10, 11, 11, 11, 11, 11, 11, 11, 11, 11,
541         11, 11, 11, 12, 13, 14, 15, 16, 17, 18,
542         18, 19, 19, 19, 19, 19, 20, 20, 20, 21,
543         21, 22, 22, 22, 23, 24, 24, 24, 24, 24,
544         24, 25, 25, 26, 26, 26, 26, 26, 26
545     };
546 
547     /*
548      * Operator names
549      */
550     String opNames[] = {
551         ",",    "=",    "*=",   "/=",   "%=",
552         "+=",   "-=",   "<<=",  ">>=",  ">>>=",
553         "&=",   "|=",   "^=",   "?:",   "||",
554         "&&",   "|",    "^",    "&",    "!=",
555         "==",   ">=",   ">",    "<=",   "<",
556         "instanceof", "<<", ">>", ">>>", "+",
557         "-",    "/",    "%",    "*",    "cast",
558         "+",    "-",    "!",    "~",    "++",
559         "--",   "new",  "new",  "new",  "++",
560         "--",   "field","method","[]",  "new",
561         "++",   "--",   null,   null,   null,
562 
563         "convert", "expr", "array", "goto", null,
564 
565         "Identifier", "boolean", "byte", "char", "short",
566         "int", "long", "float", "double", "string",
567 
568         "byte", "char", "short", "int", "long",
569         "float", "double", "void", "boolean", null,
570 
571         "true", "false", "this", "super", "null",
572         null,   null,   null,   null,   null,
573 
574         "if",   "else", "for",  "while","do",
575         "switch", "case", "default", "break", "continue",
576         "return", "try", "catch", "finally", "throw",
577         "stat", "expression", "declaration", "declaration", null,
578 
579         "import", "class", "extends", "implements", "interface",
580         "package", null, null,  null,   null,
581 
582         "private", "public", "protected", "const", "static",
583         "transient", "synchronized", "native", "final", "volatile",
584         "abstract", "strictfp", null, null, null,
585 
586         ";",    ":",    "?",    "{",    "}",
587         "(",    ")",    "[",    "]",    "throws",
588         "error", "comment", "type", "length", "inline-return",
589         "inline-method", "inline-new"
590     };
591 }
592