abstract class BTypesFromSymbols[G <: Global] extends BTypes
This class mainly contains the method classBTypeFromSymbol, which extracts the necessary information from a symbol and its type to create the corresponding ClassBType. It requires access to the compiler (global parameter).
- Source
- BTypesFromSymbols.scala
- Alphabetic
- By Inheritance
- BTypesFromSymbols
- BTypes
- AnyRef
- Any
- by any2stringadd
- by StringFormat
- by Ensuring
- by ArrowAssoc
- Hide All
- Show All
- Public
- Protected
Instance Constructors
- new BTypesFromSymbols(global: G)
Type Members
- final case class ArrayBType(componentType: BType) extends RefBType with Product with Serializable
- Definition Classes
- BTypes
- sealed abstract class BType extends AnyRef
- Definition Classes
- BTypes
- sealed abstract class ClassBType extends RefBType
A ClassBType represents a class or interface type.
A ClassBType represents a class or interface type. The necessary information to build a ClassBType is extracted from compiler symbols and types, see BTypesFromSymbols.
The
info
field contains either the class information on an error message why the info could not be computed. There are two reasons for an erroneous info:- The ClassBType was built from a class symbol that stems from a java source file, and the symbol's type could not be completed successfully (scala/bug#9111) 2. The ClassBType should be built from a classfile, but the class could not be found on the compilation classpath.
Note that all ClassBTypes required in a non-optimized run are built during code generation from the class symbols referenced by the ASTs, so they have a valid info. Therefore the backend often invokes
info.get
(which asserts the info to exist) when reading data from the ClassBType.The inliner on the other hand uses ClassBTypes that are built from classfiles, which may have a missing info. In order not to crash the compiler unnecessarily, the inliner does not force infos using
get
, but it reports inliner warnings for missing infos that prevent inlining.- Definition Classes
- BTypes
- final case class ClassInfo(superClass: Option[ClassBType], interfaces: List[ClassBType], flags: Int, nestedClasses: Lazy[List[ClassBType]], nestedInfo: Lazy[Option[NestedInfo]], inlineInfo: InlineInfo) extends Product with Serializable
The type info for a class.
The type info for a class. Used for symboltable-independent subtype checks in the backend.
- superClass
The super class, not defined for class java/lang/Object.
- interfaces
All transitively implemented interfaces, except for those inherited through the superclass.
- flags
The java flags, obtained through
javaFlags
. Used also to derive the flags for InnerClass entries.- nestedClasses
Classes nested in this class. Those need to be added to the InnerClass table, see the InnerClass spec summary above.
- nestedInfo
If this describes a nested class, information for the InnerClass table.
- inlineInfo
Information about this class for the inliner.
- Definition Classes
- BTypes
- final case class InnerClassEntry(name: String, outerName: String, innerName: String, flags: Int) extends Product with Serializable
This class holds the data for an entry in the InnerClass table.
This class holds the data for an entry in the InnerClass table. See the InnerClass summary above in this file.
There's some overlap with the class NestedInfo, but it's not exactly the same and cleaner to keep separate.
- name
The internal name of the class.
- outerName
The internal name of the outer class, may be null.
- innerName
The simple name of the inner class, may be null.
- flags
The flags for this class in the InnerClass entry.
- Definition Classes
- BTypes
- sealed abstract class Lazy[+T] extends AnyRef
- Definition Classes
- BTypes
- class LazyVar[T] extends AnyRef
This implements a lazy value that can be reset and re-initialized.
This implements a lazy value that can be reset and re-initialized. It synchronizes on
frontendLock
so that lazy state created through this utility can be safely initialized in the post-processor.Note that values defined as
LazyVar
s are usuallylazy val
s themselves (created through theperRunLazy
method). This ensures that re-initializing a component only clears thoseLazyVar
s that have actually been used in the previous compiler run.- Definition Classes
- BTypes
- final case class MethodBType(argumentTypes: Array[BType], returnType: BType) extends BType with Product with Serializable
- Definition Classes
- BTypes
- final case class MethodNameAndType(name: String, methodType: MethodBType) extends Product with Serializable
Just a named pair, used in CoreBTypes.srBoxesRuntimeBoxToMethods/srBoxesRuntimeUnboxToMethods.
Just a named pair, used in CoreBTypes.srBoxesRuntimeBoxToMethods/srBoxesRuntimeUnboxToMethods.
- Definition Classes
- BTypes
- final case class NestedInfo(enclosingClass: ClassBType, outerName: Option[String], innerName: Option[String], isStaticNestedClass: Boolean, enteringTyperPrivate: Boolean) extends Product with Serializable
Information required to add a class to an InnerClass table.
Information required to add a class to an InnerClass table. The spec summary above explains what information is required for the InnerClass entry.
- enclosingClass
The enclosing class, if it is also nested. When adding a class to the InnerClass table, enclosing nested classes are also added.
- outerName
The outerName field in the InnerClass entry, may be None.
- innerName
The innerName field, may be None.
- isStaticNestedClass
True if this is a static nested class (not inner class) (*) (*) Note that the STATIC flag in ClassInfo.flags, obtained through javaFlags(classSym), is not correct for the InnerClass entry, see javaFlags. The static flag in the InnerClass describes a source-level property: if the class is in a static context (does not have an outer pointer). This is checked when building the NestedInfo.
- Definition Classes
- BTypes
- sealed abstract class PrimitiveBType extends BType
- Definition Classes
- BTypes
- sealed abstract class RefBType extends BType
- Definition Classes
- BTypes
Abstract Value Members
- abstract val frontendAccess: PostProcessorFrontendAccess
- Definition Classes
- BTypesFromSymbols → BTypes
Concrete Value Members
- case object BOOL extends PrimitiveBType with Product with Serializable
- Definition Classes
- BTypes
- object BType
- Definition Classes
- BTypes
- object BTypeExporter extends AutoCloseable
- Definition Classes
- BTypes
- case object BYTE extends PrimitiveBType with Product with Serializable
- Definition Classes
- BTypes
- case object CHAR extends PrimitiveBType with Product with Serializable
- Definition Classes
- BTypes
- object ClassBType
- Definition Classes
- BTypes
- case object DOUBLE extends PrimitiveBType with Product with Serializable
- Definition Classes
- BTypes
- case object FLOAT extends PrimitiveBType with Product with Serializable
- Definition Classes
- BTypes
- case object INT extends PrimitiveBType with Product with Serializable
- Definition Classes
- BTypes
- case object LONG extends PrimitiveBType with Product with Serializable
- Definition Classes
- BTypes
- object Lazy
- Definition Classes
- BTypes
- case object SHORT extends PrimitiveBType with Product with Serializable
- Definition Classes
- BTypes
- case object UNIT extends PrimitiveBType with Product with Serializable
- Definition Classes
- BTypes
- def assertClassNotArray(sym: G.Symbol): Unit
- def bootstrapMethodArg(t: G.Constant, pos: G.Position): AnyRef
- def buildInlineInfoFromClassSymbol(classSym: G.Symbol): InlineInfo
Build the scala.tools.nsc.backend.jvm.BTypes.InlineInfo for a class symbol.
- def cachedClassBType(internalName: InternalName): ClassBType
Every ClassBType is cached on construction and accessible through this method.
Every ClassBType is cached on construction and accessible through this method.
The cache is used when computing stack map frames. The asm.ClassWriter invokes the method
getCommonSuperClass
. In this method we need to obtain the ClassBType for a given internal name. The method assumes that every class type that appears in the bytecode exists in the map- Definition Classes
- BTypes
- val classBTypeCache: ConcurrentHashMap[InternalName, ClassBType]
- Definition Classes
- BTypes
- final def classBTypeFromSymbol(sym: G.Symbol): ClassBType
The ClassBType for a class symbol
classSym
.The ClassBType for a class symbol
classSym
.The class symbol scala.Nothing is mapped to the class scala.runtime.Nothing$. Similarly, scala.Null is mapped to scala.runtime.Null$. This is because there exist no class files for the Nothing / Null. If used for example as a parameter type, we use the runtime classes in the classfile method signature.
- val coreBTypes: CoreBTypesFromSymbols[G] { val bTypes: BTypesFromSymbols.this.type }
- Definition Classes
- BTypesFromSymbols → BTypes
- val global: G
- def implementedInterfaces(classSym: G.Symbol): List[G.Symbol]
- final def initialize(): Unit
- def isCompilingArray: Boolean
- def isCompilingPrimitive: Boolean
True if the current compilation unit is of a primitive class (scala.Boolean et al).
True if the current compilation unit is of a primitive class (scala.Boolean et al). Used only in assertions.
- Definition Classes
- BTypesFromSymbols → BTypes
- final def isStaticModuleClass(sym: G.Symbol): Boolean
True for module classes of modules that are top-level or owned only by objects.
True for module classes of modules that are top-level or owned only by objects. Module classes for such objects will get a MODULE$ field and a corresponding static initializer.
- final def isTopLevelModuleClass(sym: G.Symbol): Boolean
True for module classes of package level objects.
True for module classes of package level objects. The backend will generate a mirror class for such objects.
- def javaFieldFlags(sym: G.Symbol): Int
- final def javaFlags(sym: G.Symbol): Int
Return the Java modifiers for the given symbol.
Return the Java modifiers for the given symbol. Java modifiers for classes:
- public, abstract, final for interfaces:
- the same as for classes, without 'final' for fields:
- public, private (*)
- static, final for methods:
- the same as for fields, plus:
- abstract, synchronized (not used), strictfp (not used), native (not used) for all:
- deprecated
(*) protected cannot be used, since inner classes 'see' protected members, and they would fail verification after lifted.
- final def methodBTypeFromMethodType(tpe: G.Type, isConstructor: Boolean): MethodBType
Builds a MethodBType for a method type.
- final def methodBTypeFromSymbol(methodSymbol: G.Symbol): MethodBType
Builds a MethodBType for a method symbol.
- def mirrorClassClassBType(moduleClassSym: G.Symbol): ClassBType
For top-level objects without a companion class, the compiler generates a mirror class with static forwarders (Java compat).
For top-level objects without a companion class, the compiler generates a mirror class with static forwarders (Java compat). There's no symbol for the mirror class, but we still need a ClassBType (its info.nestedClasses will hold the InnerClass entries, see comment in BTypes).
- def perRunLazy[T](component: PerRunInit)(init: => T): LazyVar[T]
Create state that lazily evaluated (to work around / not worry about initialization ordering issues).
Create state that lazily evaluated (to work around / not worry about initialization ordering issues). The state is cleared in each compiler run when the component is initialized.
- Definition Classes
- BTypes
- def staticHandleFromSymbol(sym: G.Symbol): Handle
- final val strMODULE_INSTANCE_FIELD: String
- final def typeToBType(t: G.Type): BType
This method returns the BType for a type reference, for example a parameter type.
The Scala compiler and reflection APIs.