A BType is either a primitve type, a ClassBType, an ArrayBType of one of these, or a MethodType referring to BTypes.
A BType is either a primitve 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 offset
and length
fields are used to represent the internal name of the class. They
are indices into some character array. The internal name can be obtained through the method
internalNameString
, which is abstract in this component. Name creation is assumed to be
hash-consed, so if two ClassBTypes have the same internal name, they NEED to have the same
offset
and length
.
The actual implementation in subclass BTypesFromSymbols uses the global chrs
array from the
name table. This representation is efficient because the JVM class name is obtained through
classSymbol.javaBinaryName
. This already adds the necessary string to the chrs
array,
so it makes sense to reuse the same name table in the backend.
ClassBType is not a case class because we want a custom equals method, and because the extractor extracts the internalName, which is what you typically need.
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.
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.
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 propety: if the class is in a static context (does not have an outer pointer). This is checked when building the NestedInfo.
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 a previously constructed ClassBType for a given internal name.
Obtain a previously constructed ClassBType for a given internal name.
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.
The ClassBType for a class symbol sym
.
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.
The string represented by the offset
/ length
values of a ClassBType, see comment of that
class.
The string represented by the offset
/ length
values of a ClassBType, see comment of that
class.
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.
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.
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$ flag and a corresponding static initializer.
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.
Return the Java modifiers for the given symbol.
Return the Java modifiers for the given symbol. Java modifiers for classes:
(*) protected cannot be used, since inner classes 'see' protected members, and they would fail verification after lifted.
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.
This class mainly contains the method classBTypeFromSymbol, which extracts the necessary information from a symbol and its type to create the correpsonding 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.