📄 symtab.java
字号:
/** * @(#)Symtab.java 1.27 03/01/23 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package com.sun.tools.javac.v8.code;import com.sun.tools.javac.v8.util.*;import com.sun.tools.javac.v8.code.Symbol.*;import com.sun.tools.javac.v8.code.Type.*;/** * A class that defines all predefined constants and operators * as well as special classes such as java.lang.Object, which need * to be known to the compiler. All symbols are held in instance * fields. This makes it possible to work in multiple concurrent * projects, which might use different class files for library classes. */public class Symtab implements Flags, ByteCodes { /** * The context key for the symbol table. */ private static final Context.Key symtabKey = new Context.Key(); /** * Get the symbol table instance. */ public static Symtab instance(Context context) { Symtab instance = (Symtab) context.get(symtabKey); if (instance == null) instance = new Symtab(context); return instance; } private final Name.Table names; private final ClassReader reader; /** * A symbol for the root package. */ public final PackageSymbol rootPackage; /** * A symbol for the empty package. */ public final PackageSymbol emptyPackage; /** * A symbol that stands for a missing symbol. */ public final TypeSymbol noSymbol; /** * The error symbol. */ public final ClassSymbol errSymbol; /** * Builtin types. */ public final Type byteType; public final Type charType; public final Type shortType; public final Type intType; public final Type longType; public final Type floatType; public final Type doubleType; public final Type booleanType; public final Type voidType; public final Type botType; public final Type errType; /** * A value for the unknown type. */ public final Type unknownType; /** * The builtin type of all arrays. */ public final ClassSymbol arrayClass; /** * The builtin type of all methods. */ public final ClassSymbol methodClass; /** * Predefined types. */ public final Type objectType; public final Type classType; public final Type classLoaderType; public final Type stringType; public final Type stringBufferType; public final Type cloneableType; public final Type serializableType; public final Type throwableType; public final Type errorType; public final Type exceptionType; public final Type runtimeExceptionType; public final Type classNotFoundExceptionType; public final Type noClassDefFoundErrorType; public final Type assertionErrorType; /** * The symbol representing the length field of an array. */ public final VarSymbol lengthVar; /** * Predefined constants. */ public final VarSymbol nullConst; public final VarSymbol trueConst; public final VarSymbol falseConst; /** * The null check operator. */ public final OperatorSymbol nullcheck; /** * The predefined type that belongs to a tag. */ public final Type[] typeOfTag = new Type[TypeTags.TypeTagCount]; /** * The name of the class that belongs to a basix type tag. */ public final Name[] boxedName = new Name[TypeTags.TypeTagCount]; /** * A hashtable containing the encountered top-level and member classes, * indexed by flat names. The table does not contain local classes. * It should be updated from the outside to reflect classes defined * by compiled source files. */ public final Hashtable classes = Hashtable.make(); /** * A hashtable containing the encountered packages. * the table should be updated from outside to reflect packages defined * by compiled source files. */ public final Hashtable packages = Hashtable.make(); public void initType(Type type, ClassSymbol c) { type.tsym = c; typeOfTag[type.tag] = type; } public void initType(Type type, String name) { initType(type, new ClassSymbol(PUBLIC, names.fromString(name), type, rootPackage)); } public void initType(Type type, String name, String bname) { initType(type, name); boxedName[type.tag] = names.fromString("java.lang." + bname); } /** * The class symbol that owns all predefined symbols. */ public final ClassSymbol predefClass; /** * Enter a constant into symbol table. * @param name The constant's name. * @param type The constant's type. */ private VarSymbol enterConstant(String name, Type type) { VarSymbol c = new VarSymbol(PUBLIC | STATIC | FINAL, names.fromString(name), type, predefClass); c.constValue = type.constValue; predefClass.members().enter(c); return c; } /** * Enter a binary operation into symbol table. * @param name The name of the operator. * @param left The type of the left operand. * @param right The type of the left operand. * @param res The operation's result type. * @param opcode The operation's bytecode instruction. */ private void enterBinop(String name, Type left, Type right, Type res, int opcode) { predefClass.members().enter( new OperatorSymbol(names.fromString(name), new MethodType(List.make(left, right), res, Type.emptyList, methodClass), opcode, predefClass)); } /** * Enter a binary operation, as above but with two opcodes, * which get encoded as (opcode1 << ByteCodeTags.preShift) + opcode2. * @param opcode1 First opcode. * @param opcode2 Second opcode. */ private void enterBinop(String name, Type left, Type right, Type res, int opcode1, int opcode2) { enterBinop(name, left, right, res, (opcode1 << ByteCodes.preShift) | opcode2); } /** * Enter a unary operation into symbol table. * @param name The name of the operator. * @param arg The type of the operand. * @param res The operation's result type. * @param opcode The operation's bytecode instruction. */ private OperatorSymbol enterUnop(String name, Type arg, Type res, int opcode) { OperatorSymbol sym = new OperatorSymbol(names.fromString(name), new MethodType(List.make(arg), res, Type.emptyList, methodClass), opcode, predefClass); predefClass.members().enter(sym); return sym; } /** * Enter a class into symbol table. * @param The name of the class. */ private Type enterClass(String s) { return reader.enterClass(names.fromString(s)).type; } /**
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -