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).
The mixin CoreBTypes defines core BTypes that are used in the backend. Building these BTypes uses classBTypeFromSymbol, hence requires access to the compiler (global).
BTypesFromSymbols extends BTypes because the implementation of BTypes requires access to some of the core btypes. They are declared in BTypes as abstract members. Note that BTypes does not have access to the compiler instance.
- Source
- BTypesFromSymbols.scala
- Alphabetic
- By Inheritance
- BTypesFromSymbols
- BTypes
- AnyRef
- Any
- by any2stringadd
- by StringFormat
- by Ensuring
- by ArrowAssoc
- Hide All
- Show All
- Public
- All
Instance Constructors
- new BTypesFromSymbols(global: G)
Type Members
-
final
case class
ArrayBType
(componentType: BType) extends RefBType with Product with Serializable
- Definition Classes
- BTypes
-
sealed
trait
BType
extends AnyRef
A BType is either a primitive type, a ClassBType, an ArrayBType of one of these, or a MethodType referring to BTypes.
A BType is either a primitive type, a ClassBType, an ArrayBType of one of these, or a MethodType referring to BTypes.
- Definition Classes
- BTypes
-
final
case class
ClassBType
(internalName: InternalName)(cache: Map[InternalName, ClassBType]) extends RefBType with Product with Serializable
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
-
final
class
Lazy
[T <: AnyRef] extends AnyRef
- Definition Classes
- BTypes
-
final
case class
MethodBType
(argumentTypes: List[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) 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
trait
PrimitiveBType
extends BType
- Definition Classes
- BTypes
-
sealed
trait
RefBType
extends BType
- Definition Classes
- BTypes
Value Members
-
object
BOOL
extends PrimitiveBType with Product with Serializable
- Definition Classes
- BTypes
-
object
BYTE
extends PrimitiveBType with Product with Serializable
- Definition Classes
- BTypes
-
object
CHAR
extends PrimitiveBType with Product with Serializable
- Definition Classes
- BTypes
-
object
ClassBType
extends Serializable
- Definition Classes
- BTypes
-
object
DOUBLE
extends PrimitiveBType with Product with Serializable
- Definition Classes
- BTypes
-
object
FLOAT
extends PrimitiveBType with Product with Serializable
- Definition Classes
- BTypes
-
object
INT
extends PrimitiveBType with Product with Serializable
- Definition Classes
- BTypes
-
object
LONG
extends PrimitiveBType with Product with Serializable
- Definition Classes
- BTypes
-
object
Lazy
- Definition Classes
- BTypes
-
object
SHORT
extends PrimitiveBType with Product with Serializable
- Definition Classes
- BTypes
-
object
UNIT
extends PrimitiveBType with Product with Serializable
- Definition Classes
- BTypes
-
final
def
!=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
##(): Int
- Definition Classes
- AnyRef → Any
-
def
+(other: String): String
- Implicit
- This member is added by an implicit conversion from BTypesFromSymbols[G] to any2stringadd[BTypesFromSymbols[G]] performed by method any2stringadd in scala.Predef.
- Definition Classes
- any2stringadd
-
def
->[B](y: B): (BTypesFromSymbols[G], B)
- Implicit
- This member is added by an implicit conversion from BTypesFromSymbols[G] to ArrowAssoc[BTypesFromSymbols[G]] performed by method ArrowAssoc in scala.Predef.
- Definition Classes
- ArrowAssoc
- Annotations
- @inline()
-
final
def
==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
def
addIndyLambdaImplMethod(hostClass: InternalName, handle: Handle): Boolean
- Definition Classes
- BTypes
-
def
addIndyLambdaImplMethod(hostClass: InternalName, handle: Seq[Handle]): Seq[Handle]
add methods
-
final
def
asInstanceOf[T0]: T0
- Definition Classes
- Any
- def assertClassNotArray(sym: G.Symbol): Unit
- def assertClassNotArrayNotPrimitive(sym: G.Symbol): Unit
-
def
bTypeForDescriptorOrInternalNameFromClassfile(desc: String): BType
Obtain the BType for a type descriptor or internal name.
Obtain the BType for a type descriptor or internal name. For class descriptors, the ClassBType is constructed by parsing the corresponding classfile.
Some JVM operations use either a full descriptor or only an internal name. Example: ANEWARRAY java/lang/String // a new array of strings (internal name for the String class) ANEWARRAY [Ljava/lang/String; // a new array of array of string (full descriptor for the String class)
This method supports both descriptors and internal names.
- Definition Classes
- BTypes
-
val
backendReporting: BackendReporting
- Definition Classes
- BTypesFromSymbols → BTypes
-
val
backendUtils: BackendUtils[BTypesFromSymbols.this.type]
- Definition Classes
- BTypesFromSymbols → BTypes
- def beanInfoClassClassBType(mainClass: G.Symbol): ClassBType
- def bootstrapMethodArg(t: G.Constant, pos: G.Position): AnyRef
-
def
buildInlineInfoFromClassSymbol(classSym: G.Symbol): InlineInfo
Build the InlineInfo for a class symbol.
-
val
byteCodeRepository: ByteCodeRepository[BTypesFromSymbols.this.type]
- Definition Classes
- BTypesFromSymbols → BTypes
-
def
cachedClassBType(internalName: InternalName): Option[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
callGraph: CallGraph[BTypesFromSymbols.this.type]
- Definition Classes
- BTypesFromSymbols → BTypes
-
val
callsitePositions: Map[MethodInsnNode, Position]
Store the position of every MethodInsnNode during code generation.
Store the position of every MethodInsnNode during code generation. This allows each callsite in the call graph to remember its source position, which is required for inliner warnings.
- Definition Classes
- BTypes
-
val
classBTypeCacheFromClassfile: Map[InternalName, ClassBType]
- Definition Classes
- BTypes
-
val
classBTypeCacheFromSymbol: Map[InternalName, ClassBType]
- Definition Classes
- BTypes
-
def
classBTypeFromClassNode(classNode: ClassNode): ClassBType
Construct the ClassBType for a parsed classfile.
Construct the ClassBType for a parsed classfile.
- Definition Classes
- BTypes
-
def
classBTypeFromParsedClassfile(internalName: InternalName): ClassBType
Parse the classfile for
internalName
and construct the ClassBType.Parse the classfile for
internalName
and construct the ClassBType. If the classfile cannot be found in thebyteCodeRepository
, theinfo
of the resulting ClassBType is undefined.- 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.
-
def
clone(): AnyRef
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
val
closureOptimizer: ClosureOptimizer[BTypesFromSymbols.this.type]
- Definition Classes
- BTypesFromSymbols → BTypes
-
def
compilerSettings: ScalaSettings
- Definition Classes
- BTypesFromSymbols → BTypes
-
val
coreBTypes: CoreBTypesProxy[BTypesFromSymbols.this.type]
- Definition Classes
- BTypesFromSymbols → BTypes
-
def
ensuring(cond: (BTypesFromSymbols[G]) ⇒ Boolean, msg: ⇒ Any): BTypesFromSymbols[G]
- Implicit
- This member is added by an implicit conversion from BTypesFromSymbols[G] to Ensuring[BTypesFromSymbols[G]] performed by method Ensuring in scala.Predef.
- Definition Classes
- Ensuring
-
def
ensuring(cond: (BTypesFromSymbols[G]) ⇒ Boolean): BTypesFromSymbols[G]
- Implicit
- This member is added by an implicit conversion from BTypesFromSymbols[G] to Ensuring[BTypesFromSymbols[G]] performed by method Ensuring in scala.Predef.
- Definition Classes
- Ensuring
-
def
ensuring(cond: Boolean, msg: ⇒ Any): BTypesFromSymbols[G]
- Implicit
- This member is added by an implicit conversion from BTypesFromSymbols[G] to Ensuring[BTypesFromSymbols[G]] performed by method Ensuring in scala.Predef.
- Definition Classes
- Ensuring
-
def
ensuring(cond: Boolean): BTypesFromSymbols[G]
- Implicit
- This member is added by an implicit conversion from BTypesFromSymbols[G] to Ensuring[BTypesFromSymbols[G]] performed by method Ensuring in scala.Predef.
- Definition Classes
- Ensuring
-
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
def
equals(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
def
finalize(): Unit
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] )
-
def
formatted(fmtstr: String): String
- Implicit
- This member is added by an implicit conversion from BTypesFromSymbols[G] to StringFormat[BTypesFromSymbols[G]] performed by method StringFormat in scala.Predef.
- Definition Classes
- StringFormat
- Annotations
- @inline()
-
val
frontendLock: AnyRef
- Definition Classes
- BTypes
-
final
def
getClass(): Class[_]
- Definition Classes
- AnyRef → Any
-
def
getIndyLambdaImplMethods(hostClass: InternalName): Iterable[Handle]
- Definition Classes
- BTypes
- val global: G
- final def hasPublicBitSet(flags: Int): Boolean
-
def
hashCode(): Int
- Definition Classes
- AnyRef → Any
- def implementedInterfaces(classSym: G.Symbol): List[G.Symbol]
-
val
indyLambdaImplMethods: AnyRefMap[InternalName, LinkedHashSet[Handle]]
Classes with indyLambda closure instantiations where the SAM type is serializable (e.g.
Classes with indyLambda closure instantiations where the SAM type is serializable (e.g. Scala's FunctionN) need a
$deserializeLambda$
method. This map contains classes for which such a method has been generated. It is used during ordinary code generation, as well as during inlining: when inlining an indyLambda instruction into a class, we need to make sure the class has the method.- Definition Classes
- BTypes
- final def initializeCoreBTypes(): Unit
-
val
inlineAnnotatedCallsites: Set[MethodInsnNode]
Stores callsite instructions of invocations annotated
f(): @inline/noinline
.Stores callsite instructions of invocations annotated
f(): @inline/noinline
. Instructions are added during code generation (BCodeBodyBuilder). The maps are then queried when building the CallGraph, every Callsite object has an annotated(No)Inline field.- Definition Classes
- BTypes
-
def
inlineInfoFromClassfile(classNode: ClassNode): InlineInfo
Build the InlineInfo for a class.
Build the InlineInfo for a class. For Scala classes, the information is stored in the ScalaInlineInfo attribute. If the attribute is missing, the InlineInfo is built using the metadata available in the classfile (ACC_FINAL flags, etc).
- Definition Classes
- BTypes
-
val
inliner: Inliner[BTypesFromSymbols.this.type]
- Definition Classes
- BTypesFromSymbols → BTypes
-
val
inlinerHeuristics: InlinerHeuristics[BTypesFromSymbols.this.type]
- Definition Classes
- BTypesFromSymbols → BTypes
- 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
isInstanceOf[T0]: Boolean
- Definition Classes
- Any
- final def isRemote(s: G.Symbol): Boolean
-
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.
-
val
javaDefinedClasses: Set[InternalName]
Contains the internal names of all classes that are defined in Java source files of the current compilation run (mixed compilation).
Contains the internal names of all classes that are defined in Java source files of the current compilation run (mixed compilation). Used for more detailed error reporting.
- Definition Classes
- BTypes
- 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, strictfp (not used) 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.
-
val
localOpt: LocalOpt[BTypesFromSymbols.this.type]
- Definition Classes
- BTypesFromSymbols → BTypes
-
val
maxLocalsMaxStackComputed: Set[MethodNode]
Cache of methods which have correct
maxLocals
/maxStack
values assigned.Cache of methods which have correct
maxLocals
/maxStack
values assigned. This allows invokingcomputeMaxLocalsMaxStack
whenever running an analyzer but performing the actual computation only when necessary.- Definition Classes
- BTypes
-
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).
-
final
def
ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
val
noInlineAnnotatedCallsites: Set[MethodInsnNode]
- Definition Classes
- BTypes
-
final
def
notify(): Unit
- Definition Classes
- AnyRef
-
final
def
notifyAll(): Unit
- Definition Classes
- AnyRef
-
def
recordPerRunCache[T <: Clearable](cache: T): T
- Definition Classes
- BTypesFromSymbols → BTypes
-
def
removeIndyLambdaImplMethod(hostClass: InternalName, handle: Seq[Handle]): Unit
- Definition Classes
- BTypes
- def staticHandleFromSymbol(sym: G.Symbol): Handle
- final val strMODULE_INSTANCE_FIELD: String
-
final
def
synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
-
def
toString(): String
- Definition Classes
- AnyRef → Any
-
final
def
typeToBType(t: G.Type): BType
This method returns the BType for a type reference, for example a parameter type.
-
val
unreachableCodeEliminated: Set[MethodNode]
Cache, contains methods whose unreachable instructions are eliminated.
Cache, contains methods whose unreachable instructions are eliminated.
The ASM Analyzer class does not compute any frame information for unreachable instructions. Transformations that use an analyzer (including inlining) therefore require unreachable code to be eliminated.
This cache allows running dead code elimination whenever an analyzer is used. If the method is already optimized, DCE can return early.
- Definition Classes
- BTypes
-
final
def
wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
def
→[B](y: B): (BTypesFromSymbols[G], B)
- Implicit
- This member is added by an implicit conversion from BTypesFromSymbols[G] to ArrowAssoc[BTypesFromSymbols[G]] performed by method ArrowAssoc in scala.Predef.
- Definition Classes
- ArrowAssoc
The Scala compiler and reflection APIs.