A BType is either a primitive type, a ClassBType, an ArrayBType of one of these, or a MethodType referring to BTypes.
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:
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.
The type info for a class.
The type info for a class. Used for symboltable-independent subtype checks in the backend.
The super class, not defined for class java/lang/Object.
All transitively implemented interfaces, except for those inherited through the superclass.
The java flags, obtained through javaFlags
. Used also to derive
the flags for InnerClass entries.
Classes nested in this class. Those need to be added to the InnerClass table, see the InnerClass spec summary above.
If this describes a nested class, information for the InnerClass table.
Information about this class for the inliner.
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.
The internal name of the class.
The internal name of the outer class, may be null.
The simple name of the inner class, may be null.
The flags for this class in the InnerClass entry.
Just a named pair, used in CoreBTypes.asmBoxTo/asmUnboxTo.
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.
The enclosing class, if it is also nested. When adding a class to the InnerClass table, enclosing nested classes are also added.
The outerName field in the InnerClass entry, may be None.
The innerName field, may be None.
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.
Tools for parsing classfiles, used by the inliner.
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. Abstract here because its implementation depends on global.
Test two objects for inequality.
Test two objects for inequality.
true
if !(this == that), false otherwise.
Equivalent to x.hashCode
except for boxed numeric types and null
.
Equivalent to x.hashCode
except for boxed numeric types and null
.
For numerics, it returns a hash value which is consistent
with value equality: if two value type instances compare
as true, then ## will produce the same hash value for each
of them.
For null
returns a hashcode where null.hashCode
throws a
NullPointerException
.
a hash value consistent with ==
The expression x == that
is equivalent to if (x eq null) that eq null else x.equals(that)
.
The expression x == that
is equivalent to if (x eq null) that eq null else x.equals(that)
.
the object to compare against this object for equality.
true
if the receiver object is equivalent to the argument; false
otherwise.
Cast the receiver object to be of type T0
.
Cast the receiver object to be of type T0
.
Note that the success of a cast at runtime is modulo Scala's erasure semantics.
Therefore the expression 1.asInstanceOf[String]
will throw a ClassCastException
at
runtime, while the expression List(1).asInstanceOf[List[String]]
will not.
In the latter example, because the type argument is erased as part of compilation it is
not possible to check whether the contents of the list are of the requested type.
the receiver object.
ClassCastException
if the receiver object is not an instance of the erasure of type T0
.
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.
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.
Construct the ClassBType for a parsed classfile.
A map from internal names to ClassBTypes.
A map from internal names to ClassBTypes. Every ClassBType is added to this map on its construction.
This map 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.
Concurrent because stack map frames are computed when in the class writer, which might run on multiple classes concurrently.
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 the byteCodeRepository
, the info
of the resulting ClassBType is undefined.
Create a copy of the receiver object.
Create a copy of the receiver object.
The default implementation of the clone
method is platform dependent.
a copy of the receiver object.
not specified by SLS as a member of AnyRef
Tests whether the argument (arg0
) is a reference to the receiver object (this
).
Tests whether the argument (arg0
) is a reference to the receiver object (this
).
The eq
method implements an equivalence relation on
non-null instances of AnyRef
, and has three additional properties:
x
and y
of type AnyRef
, multiple invocations of
x.eq(y)
consistently returns true
or consistently returns false
.x
of type AnyRef
, x.eq(null)
and null.eq(x)
returns false
.null.eq(null)
returns true
. When overriding the equals
or hashCode
methods, it is important to ensure that their behavior is
consistent with reference equality. Therefore, if two objects are references to each other (o1 eq o2
), they
should be equal to each other (o1 == o2
) and they should hash to the same value (o1.hashCode == o2.hashCode
).
true
if the argument is a reference to the receiver object; false
otherwise.
The equality method for reference types.
Called by the garbage collector on the receiver object when there are no more references to the object.
Called by the garbage collector on the receiver object when there are no more references to the object.
The details of when and if the finalize
method is invoked, as
well as the interaction between finalize
and non-local returns
and exceptions, are all platform dependent.
not specified by SLS as a member of AnyRef
A representation that corresponds to the dynamic class of the receiver object.
A representation that corresponds to the dynamic class of the receiver object.
The nature of the representation is platform dependent.
a representation that corresponds to the dynamic class of the receiver object.
not specified by SLS as a member of AnyRef
The hashCode method for reference types.
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).
Test whether the dynamic type of the receiver object is T0
.
Test whether the dynamic type of the receiver object is T0
.
Note that the result of the test is modulo Scala's erasure semantics.
Therefore the expression 1.isInstanceOf[String]
will return false
, while the
expression List(1).isInstanceOf[List[String]]
will return true
.
In the latter example, because the type argument is erased as part of compilation it is
not possible to check whether the contents of the list are of the specified type.
true
if the receiver object is an instance of erasure of type T0
; false
otherwise.
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.
Equivalent to !(this eq that)
.
Equivalent to !(this eq that)
.
true
if the argument is not a reference to the receiver object; false
otherwise.
Wakes up a single thread that is waiting on the receiver object's monitor.
Wakes up a single thread that is waiting on the receiver object's monitor.
not specified by SLS as a member of AnyRef
Wakes up all threads that are waiting on the receiver object's monitor.
Wakes up all threads that are waiting on the receiver object's monitor.
not specified by SLS as a member of AnyRef
Creates a String representation of this object.
Creates a String representation of this object. The default representation is platform dependent. On the java platform it is the concatenation of the class name, "@", and the object's hashcode in hexadecimal.
a String representation of the object.
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.
The BTypes component defines The BType class hierarchy. A BType stores all type information that is required after building the ASM nodes. This includes optimizations, generation of InnerClass attributes and generation of stack map frames.
The representation is immutable and independent of the compiler data structures, hence it can be queried by concurrent threads.