blob: 4589f263b307c4daee003b0bb2aa888f9215129a [file] [log] [blame]
/*
* Copyright (c) 1994, 2004, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package sun.tools.java;
/**
* This interface defines constant that are used
* throughout the compiler. It inherits from RuntimeConstants,
* which is an autogenerated class that contains contstants
* defined in the interpreter.
*
* WARNING: The contents of this source file are not part of any
* supported API. Code that depends on them does so at its own risk:
* they are subject to change or removal without notice.
*
* @author Arthur van Hoff
*/
public
interface Constants extends RuntimeConstants {
/*
* Enable/disable inclusion of certain debug tracing code in the
* compiler. When included, the tracing code may be selectively
* enabled at runtime, otherwise we save the space/time overhead.
* Should normally be 'false' for a release version.
*/
public static final boolean tracing = true;
/*
* Frequently used identifiers
*/
Identifier idAppend = Identifier.lookup("append");
Identifier idClassInit = Identifier.lookup("<clinit>");
Identifier idCode = Identifier.lookup("Code");
Identifier idInit = Identifier.lookup("<init>");
Identifier idLength = Identifier.lookup("length");
Identifier idNull = Identifier.lookup("");
Identifier idStar = Identifier.lookup("*");
Identifier idSuper = Identifier.lookup("super");
Identifier idThis = Identifier.lookup("this");
Identifier idClass = Identifier.lookup("class");
Identifier idToString = Identifier.lookup("toString");
Identifier idValueOf = Identifier.lookup("valueOf");
Identifier idNew = Identifier.lookup("new");
Identifier idGetClass = Identifier.lookup("getClass");
Identifier idTYPE = Identifier.lookup("TYPE");
Identifier idFinallyReturnValue = Identifier.lookup("<return>");
Identifier idJavaLang = Identifier.lookup("java.lang");
Identifier idJavaLangCloneable = Identifier.lookup("java.lang.Cloneable");
Identifier idJavaLangError = Identifier.lookup("java.lang.Error");
Identifier idJavaLangException = Identifier.lookup("java.lang.Exception");
Identifier idJavaLangObject = Identifier.lookup("java.lang.Object");
Identifier idJavaLangClass = Identifier.lookup("java.lang.Class");
Identifier idJavaLangRuntimeException =
Identifier.lookup("java.lang.RuntimeException");
Identifier idJavaLangString = Identifier.lookup("java.lang.String");
Identifier idJavaLangStringBuffer =
Identifier.lookup("java.lang.StringBuffer");
Identifier idJavaLangThrowable = Identifier.lookup("java.lang.Throwable");
Identifier idJavaIoSerializable = Identifier.lookup("java.io.Serializable");
Identifier idConstantValue = Identifier.lookup("ConstantValue");
Identifier idLocalVariableTable = Identifier.lookup("LocalVariableTable");
Identifier idLineNumberTable = Identifier.lookup("LineNumberTable");
// JCOV
Identifier idCoverageTable = Identifier.lookup("CoverageTable");
// end JCOV
Identifier idSourceFile = Identifier.lookup("SourceFile");
Identifier idDocumentation = Identifier.lookup("Documentation");
Identifier idDeprecated = Identifier.lookup("Deprecated");
Identifier idSynthetic = Identifier.lookup("Synthetic");
Identifier idExceptions = Identifier.lookup("Exceptions");
Identifier idInnerClasses = Identifier.lookup("InnerClasses");
/* methods we need to know about */
Identifier idClone = Identifier.lookup("clone");
/* This is not a real signature marker, since it is also
* an identifier constituent character.
*/
char SIGC_INNERCLASS = '$';
String SIG_INNERCLASS = "$";
String prefixThis = "this$";
String prefixVal = "val$";
String prefixLoc = "loc$";
String prefixAccess = "access$";
String prefixClass = "class$";
String prefixArray = "array$";
/*
* Flags
*/
int F_VERBOSE = 1 << 0;
int F_DUMP = 1 << 1;
int F_WARNINGS = 1 << 2;
// The meaning of -g has changed, so F_DEBUG flag is removed.
// public static final int F_DEBUG = 1 << 3;
int F_DEBUG_LINES = 1 << 12;
int F_DEBUG_VARS = 1 << 13;
int F_DEBUG_SOURCE = 1 << 18;
// The meaning of -O has changed, so F_OPTIMIZE flag is removed.
// public static final int F_OPTIMIZE = 1 << 4;
int F_OPT = 1 << 14;
int F_OPT_INTERCLASS = 1 << 15;
int F_DEPENDENCIES = 1 << 5;
// JCOV
int F_COVERAGE = 1 << 6;
int F_COVDATA = 1 << 7;
// end JCOV
int F_DEPRECATION = 1 << 9;
int F_PRINT_DEPENDENCIES = 1 << 10;
int F_VERSION12 = 1 << 11;
int F_ERRORSREPORTED = 1 << 16;
int F_STRICTDEFAULT = 1 << 17;
/*
* Modifiers.
*
* There has been much confusion regarding modifiers. There
* are a number of distinct usages:
*
* - in classfiles to annotate classes, as per JVM pg. 102.
* - in classfiles to annotate methods, as per JVM pg. 104.
* - in classfiles to annotate InnerClass attributes, as per
* http://java.sun.com/products/jdk/1.1/docs/guide/innerclasses
* - in the compiler to record java source level modifiers,
* as per JLS pg. 157 et al., plus misc. info such as whether
* a method is deprecated
* - in the JVM to record misc. info, such as whether a method has
* has been compiled
*
* To make matters worse, the terms "access flags" and "modifiers"
* are often used interchangably, and some information that might
* make sense as a flag is expressed using attributes (ie. Synthetic).
*
* The constants defined herein have been divided by whether they
* make sense only within the compiler (M_* and MM_*) or whether
* they only make sense to the JVM (ACC_* and ACCM_*). At an earlier
* time these were all lumped together. Future maintenance should
* strive to keep the distinction clear.
*
* Note that modifier M_STRICTFP is not in general recoverable from
* the ACC_STRICT bit in classfiles.
*
* Note also that the modifiers M_LOCAL and M_ANONYMOUS do not appear
* in the InnerClass attribute, as they are above the first 16 bits.
*/
// Modifiers meaningful to both Java source and the JVM. These
// have been kept the same bit in the M_* and ACC_* forms
// to avoid destabilizing the compiler.
int M_PUBLIC = ACC_PUBLIC;
int M_PRIVATE = ACC_PRIVATE;
int M_PROTECTED = ACC_PROTECTED;
int M_STATIC = ACC_STATIC;
int M_TRANSIENT = ACC_TRANSIENT;
int M_SYNCHRONIZED = ACC_SYNCHRONIZED; // collides with ACC_SUPER
int M_ABSTRACT = ACC_ABSTRACT;
int M_NATIVE = ACC_NATIVE;
int M_FINAL = ACC_FINAL;
int M_VOLATILE = ACC_VOLATILE;
int M_INTERFACE = ACC_INTERFACE;
// Modifiers not meaningful to the JVM. The JVM only allows 16 bits
// for modifiers, so keeping these in the unusable bits after the first
// 16 is a good idea.
int M_ANONYMOUS = 0x00010000;
int M_LOCAL = 0x00020000;
int M_DEPRECATED = 0x00040000;
int M_SYNTHETIC = 0x00080000;
int M_INLINEABLE = 0x00100000;
int M_STRICTFP = 0x00200000;
String paraDeprecated = "@deprecated";
// Masks for modifiers that apply to Java source code
int MM_CLASS = M_PUBLIC
| M_INTERFACE
| M_FINAL
| M_ABSTRACT
| M_STRICTFP;
int MM_MEMBER = M_PUBLIC
| M_PRIVATE
| M_PROTECTED
| M_FINAL
| M_STATIC;
int MM_FIELD = MM_MEMBER
| M_TRANSIENT
| M_VOLATILE;
int MM_METHOD = MM_MEMBER
| M_SYNCHRONIZED
| M_ABSTRACT
| M_NATIVE
| M_STRICTFP;
// Masks for modifiers that apply to class files.
// Note that the M_SYNTHETIC modifier is never written out to a class file.
// Synthetic members are indicated using the "Synthetic" attribute.
int ACCM_CLASS = ACC_PUBLIC
| ACC_INTERFACE
| ACC_FINAL
| ACC_ABSTRACT
| ACC_SUPER
| ACC_STRICT;
int ACCM_MEMBER = ACC_PUBLIC
| ACC_PRIVATE
| ACC_PROTECTED
| ACC_FINAL
| ACC_STATIC;
// The M_ANONYMOUS and M_LOCAL modifiers are not mentioned in the
// inner classes specification and are never written to classfiles.
// Also note that ACC_SUPER should never be set in an InnerClass
// attribute.
int ACCM_INNERCLASS = ACC_PUBLIC
| ACC_PRIVATE
| ACC_PROTECTED
| ACC_STATIC
| ACC_ABSTRACT
| ACC_FINAL
| ACC_INTERFACE
| ACC_STRICT;
int ACCM_FIELD = ACCM_MEMBER
| ACC_TRANSIENT
| ACC_VOLATILE;
int ACCM_METHOD = ACCM_MEMBER
| ACC_SYNCHRONIZED
| ACC_ABSTRACT
| ACC_NATIVE
| ACC_STRICT;
/*
* Type codes
*/
int TC_BOOLEAN = 0;
int TC_BYTE = 1;
int TC_CHAR = 2;
int TC_SHORT = 3;
int TC_INT = 4;
int TC_LONG = 5;
int TC_FLOAT = 6;
int TC_DOUBLE = 7;
int TC_NULL = 8;
int TC_ARRAY = 9;
int TC_CLASS = 10;
int TC_VOID = 11;
int TC_METHOD = 12;
int TC_ERROR = 13;
// JCOV
/*
* Cover's types
*/
int CT_FIRST_KIND = 1;
int CT_METHOD = 1;
int CT_FIKT_METHOD = 2;
int CT_BLOCK = 3;
int CT_FIKT_RET = 4;
int CT_CASE = 5;
int CT_SWITH_WO_DEF = 6;
int CT_BRANCH_TRUE = 7;
int CT_BRANCH_FALSE = 8;
int CT_LAST_KIND = 8;
// end JCOV
/*
* Type Masks
*/
int TM_NULL = 1 << TC_NULL;
int TM_VOID = 1 << TC_VOID;
int TM_BOOLEAN = 1 << TC_BOOLEAN;
int TM_BYTE = 1 << TC_BYTE;
int TM_CHAR = 1 << TC_CHAR;
int TM_SHORT = 1 << TC_SHORT;
int TM_INT = 1 << TC_INT;
int TM_LONG = 1 << TC_LONG;
int TM_FLOAT = 1 << TC_FLOAT;
int TM_DOUBLE = 1 << TC_DOUBLE;
int TM_ARRAY = 1 << TC_ARRAY;
int TM_CLASS = 1 << TC_CLASS;
int TM_METHOD = 1 << TC_METHOD;
int TM_ERROR = 1 << TC_ERROR;
int TM_INT32 = TM_BYTE | TM_SHORT | TM_CHAR | TM_INT;
int TM_NUM32 = TM_INT32 | TM_FLOAT;
int TM_NUM64 = TM_LONG | TM_DOUBLE;
int TM_INTEGER = TM_INT32 | TM_LONG;
int TM_REAL = TM_FLOAT | TM_DOUBLE;
int TM_NUMBER = TM_INTEGER | TM_REAL;
int TM_REFERENCE = TM_ARRAY | TM_CLASS | TM_NULL;
/*
* Class status
*/
int CS_UNDEFINED = 0;
int CS_UNDECIDED = 1;
int CS_BINARY = 2;
int CS_SOURCE = 3;
int CS_PARSED = 4;
int CS_CHECKED = 5;
int CS_COMPILED = 6;
int CS_NOTFOUND = 7;
/*
* Attributes
*/
int ATT_ALL = 0xFFFFFFFF;
int ATT_CODE = 1 << 1;
int ATT_ALLCLASSES = 1 << 2;
/*
* Number of bits used in file offsets. The line number and
* file offset are concatenated into a long, with enough room
* for other information to be added later if desired (such as
* token lengths). For the moment explicit bit manipulations
* are used to modify the fields. This makes sense for efficiency
* but at some point these ought to be better encapsulated.
*/
int WHEREOFFSETBITS = 32;
long MAXFILESIZE = (1L << WHEREOFFSETBITS) - 1;
long MAXLINENUMBER = (1L << (64 - WHEREOFFSETBITS)) - 1;
/*
* Operators
*/
int COMMA = 0;
int ASSIGN = 1;
int ASGMUL = 2;
int ASGDIV = 3;
int ASGREM = 4;
int ASGADD = 5;
int ASGSUB = 6;
int ASGLSHIFT = 7;
int ASGRSHIFT = 8;
int ASGURSHIFT = 9;
int ASGBITAND = 10;
int ASGBITOR = 11;
int ASGBITXOR = 12;
int COND = 13;
int OR = 14;
int AND = 15;
int BITOR = 16;
int BITXOR = 17;
int BITAND = 18;
int NE = 19;
int EQ = 20;
int GE = 21;
int GT = 22;
int LE = 23;
int LT = 24;
int INSTANCEOF = 25;
int LSHIFT = 26;
int RSHIFT = 27;
int URSHIFT = 28;
int ADD = 29;
int SUB = 30;
int DIV = 31;
int REM = 32;
int MUL = 33;
int CAST = 34; // (x)y
int POS = 35; // +x
int NEG = 36; // -x
int NOT = 37;
int BITNOT = 38;
int PREINC = 39; // ++x
int PREDEC = 40; // --x
int NEWARRAY = 41;
int NEWINSTANCE = 42;
int NEWFROMNAME = 43;
int POSTINC = 44; // x++
int POSTDEC = 45; // x--
int FIELD = 46;
int METHOD = 47; // x(y)
int ARRAYACCESS = 48; // x[y]
int NEW = 49;
int INC = 50;
int DEC = 51;
int CONVERT = 55; // implicit conversion
int EXPR = 56; // (x)
int ARRAY = 57; // {x, y, ...}
int GOTO = 58;
/*
* Value tokens
*/
int IDENT = 60;
int BOOLEANVAL = 61;
int BYTEVAL = 62;
int CHARVAL = 63;
int SHORTVAL = 64;
int INTVAL = 65;
int LONGVAL = 66;
int FLOATVAL = 67;
int DOUBLEVAL = 68;
int STRINGVAL = 69;
/*
* Type keywords
*/
int BYTE = 70;
int CHAR = 71;
int SHORT = 72;
int INT = 73;
int LONG = 74;
int FLOAT = 75;
int DOUBLE = 76;
int VOID = 77;
int BOOLEAN = 78;
/*
* Expression keywords
*/
int TRUE = 80;
int FALSE = 81;
int THIS = 82;
int SUPER = 83;
int NULL = 84;
/*
* Statement keywords
*/
int IF = 90;
int ELSE = 91;
int FOR = 92;
int WHILE = 93;
int DO = 94;
int SWITCH = 95;
int CASE = 96;
int DEFAULT = 97;
int BREAK = 98;
int CONTINUE = 99;
int RETURN = 100;
int TRY = 101;
int CATCH = 102;
int FINALLY = 103;
int THROW = 104;
int STAT = 105;
int EXPRESSION = 106;
int DECLARATION = 107;
int VARDECLARATION = 108;
/*
* Declaration keywords
*/
int IMPORT = 110;
int CLASS = 111;
int EXTENDS = 112;
int IMPLEMENTS = 113;
int INTERFACE = 114;
int PACKAGE = 115;
/*
* Modifier keywords
*/
int PRIVATE = 120;
int PUBLIC = 121;
int PROTECTED = 122;
int CONST = 123;
int STATIC = 124;
int TRANSIENT = 125;
int SYNCHRONIZED = 126;
int NATIVE = 127;
int FINAL = 128;
int VOLATILE = 129;
int ABSTRACT = 130;
int STRICTFP = 131;
/*
* Punctuation
*/
int SEMICOLON = 135;
int COLON = 136;
int QUESTIONMARK = 137;
int LBRACE = 138;
int RBRACE = 139;
int LPAREN = 140;
int RPAREN = 141;
int LSQBRACKET = 142;
int RSQBRACKET = 143;
int THROWS = 144;
/*
* Special tokens
*/
int ERROR = 145; // an error
int COMMENT = 146; // not used anymore.
int TYPE = 147;
int LENGTH = 148;
int INLINERETURN = 149;
int INLINEMETHOD = 150;
int INLINENEWINSTANCE = 151;
/*
* Operator precedence
*/
int opPrecedence[] = {
10, 11, 11, 11, 11, 11, 11, 11, 11, 11,
11, 11, 11, 12, 13, 14, 15, 16, 17, 18,
18, 19, 19, 19, 19, 19, 20, 20, 20, 21,
21, 22, 22, 22, 23, 24, 24, 24, 24, 24,
24, 25, 25, 26, 26, 26, 26, 26, 26
};
/*
* Operator names
*/
String opNames[] = {
",", "=", "*=", "/=", "%=",
"+=", "-=", "<<=", ">>=", ">>>=",
"&=", "|=", "^=", "?:", "||",
"&&", "|", "^", "&", "!=",
"==", ">=", ">", "<=", "<",
"instanceof", "<<", ">>", ">>>", "+",
"-", "/", "%", "*", "cast",
"+", "-", "!", "~", "++",
"--", "new", "new", "new", "++",
"--", "field","method","[]", "new",
"++", "--", null, null, null,
"convert", "expr", "array", "goto", null,
"Identifier", "boolean", "byte", "char", "short",
"int", "long", "float", "double", "string",
"byte", "char", "short", "int", "long",
"float", "double", "void", "boolean", null,
"true", "false", "this", "super", "null",
null, null, null, null, null,
"if", "else", "for", "while","do",
"switch", "case", "default", "break", "continue",
"return", "try", "catch", "finally", "throw",
"stat", "expression", "declaration", "declaration", null,
"import", "class", "extends", "implements", "interface",
"package", null, null, null, null,
"private", "public", "protected", "const", "static",
"transient", "synchronized", "native", "final", "volatile",
"abstract", "strictfp", null, null, null,
";", ":", "?", "{", "}",
"(", ")", "[", "]", "throws",
"error", "comment", "type", "length", "inline-return",
"inline-method", "inline-new"
};
}