/* * 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" }; }