Semantic
Checks safe initialization of objects
This algorithm cannot handle safe access of global object names. That part is handled by the check in Objects
(@see Objects).
Attributes
- Graph
-
- Supertypes
- Self type
-
Semantic.type
Members list
Type members
Classlikes
Cache used in fixed point computation
Cache used in fixed point computation
The analysis computes the least fixed point for the cache (see doc for ExprValueCache
).
For the fixed point computation to terminate, we need to make sure that the domain of the cache, i.e. the key pair (Ref, Tree) is finite. As the code is finite, we only need to carefully design the abstract domain to be finitary.
We also need to make sure that the computing function (i.e. the abstract interpreter) is monotone. Error handling breaks monotonicity of the abstract interpreter, because when an error happens, we always return the bottom value Hot
for an expression. It is not a threat for termination because when an error happens, we stop the fixed point computation at the end of the iteration where the error happens. Care must be paid to tests of errors, monotonicity will be broken if we simply ignore the test errors (See TryReporter
).
Note: It's tempting to use location of trees as key. That should be avoided as a template may have the same location as its single statement body. Macros may also create incorrect locations.
Attributes
- Supertypes
- Self type
-
Cache.type
A function value
A function value
Attributes
- Supertypes
-
trait Serializabletrait Producttrait Equalsclass Valueclass Objecttrait Matchableclass AnyShow all
The abstract object which stores value about its fields and immediate outers.
The abstract object which stores value about its fields and immediate outers.
Semantically it suffices to store the outer for klass
. We cache other outers for performance reasons.
Note: Object is NOT a value.
Attributes
- Supertypes
A value which represents a set of addresses
A value which represents a set of addresses
It comes from if
expressions.
Attributes
- Supertypes
-
trait Serializabletrait Producttrait Equalsclass Valueclass Objecttrait Matchableclass AnyShow all
Error reporting
A TryReporter cannot be simply thrown away
A TryReporter cannot be simply thrown away
Either abort
should be called or the errors be reported.
If errors are ignored and abort
is not called, the monotonicity of the computation function is not guaranteed, thus termination of fixed-point computation becomes a problem.
Attributes
- Supertypes
- Known subtypes
-
class TryBufferedReporter
Abstract values
Abstract values
Value = Hot | Cold | Warm | ThisRef | Fun | RefSet
Cold
┌──────► ▲ ◄────┐ ◄────┐
│ │ │ │
│ │ │ │
| │ │ │
| │ │ │
ThisRef Warm Fun RefSet │ ▲ ▲ ▲ │ │ │ │ | │ │ │ ▲ │ │ │ │ │ │ │ └─────────┴───────┴───────┘ Hot
The diagram above does not reflect relationship between RefSet
and other values. RefSet
represents a set of values which could be ThisRef
, Warm
or Fun
. The following ordering applies for RefSet:
R_a ⊑ R_b if R_a ⊆ R_b
V ⊑ R if V ∈ R
Attributes
- Supertypes
- Known subtypes
An object with all fields initialized but reaches objects under initialization
Value members
Concrete methods
Handles the evaluation of different expressions
Handles the evaluation of different expressions
Note: Recursive call should go to eval
instead of cases
.
Value parameters
- expr
-
The expression to be evaluated.
- klass
-
The enclosing class where the expression
expr
is located. - thisV
-
The value for
C.this
whereC
is represented by the parameterklass
.
Attributes
Handle semantics of leaf nodes
Handle semantics of leaf nodes
For leaf nodes, their semantics is determined by their types.
Value parameters
- klass
-
The enclosing class where the type
tp
is located. - thisV
-
The value for
C.this
whereC
is represented by the parameterklass
. - tp
-
The type to be evaluated.
Attributes
Check the specified concrete classes
Check the specified concrete classes
Attributes
Check that path in path-dependent types are initialized
Check that path in path-dependent types are initialized
This is intended to avoid type soundness issues in Dotty.
Attributes
Evaluate an expression with the given value for this
in a given class klass
Evaluate an expression with the given value for this
in a given class klass
Note that klass
might be a super class of the object referred by thisV
. The parameter klass
is needed for this
resolution. Consider the following code:
class A { A.this class B extends A { A.this } }
As can be seen above, the meaning of the expression A.this
depends on where it is located.
This method only handles cache logic and delegates the work to cases
.
Value parameters
- cacheResult
-
It is used to reduce the size of the cache.
- expr
-
The expression to be evaluated.
- klass
-
The enclosing class where the expression is located.
- thisV
-
The value for
C.this
whereC
is represented by the parameterklass
.
Attributes
Evaluate a list of expressions
Evaluate a list of expressions
Attributes
Evaluate arguments of methods
Evaluate arguments of methods
Attributes
Initialize part of an abstract object in klass
of the inheritance chain
Initialize part of an abstract object in klass
of the inheritance chain
Value parameters
- klass
-
The class to which the template belongs.
- thisV
-
The value of the current object to be initialized.
- tpl
-
The class body to be evaluated.
Attributes
Compute the outer value that correspond to tref.prefix
Compute the outer value that correspond to tref.prefix
Value parameters
- klass
-
The enclosing class where the type
tref
is located. - thisV
-
The value for
C.this
whereC
is represented by the parameterklass
. - tref
-
The type whose prefix is to be evaluated.
Attributes
Resolve C.this that appear in klass
Resolve C.this that appear in klass
Value parameters
- klass
-
The enclosing class where the type
C.this
is located. - target
-
The class symbol for
C
for whichC.this
is to be resolved. - thisV
-
The value for
D.this
whereD
is represented by the parameterklass
.
Attributes
Extensions
Extensions
Update field value of the abstract object
Update field value of the abstract object
Invariant: fields are immutable and only set once
Attributes
Update the immediate outer of the given klass
of the abstract object
Update the immediate outer of the given klass
of the abstract object
Invariant: outers are immutable and only set once
Attributes
Whether the object is fully assigned
Whether the object is fully assigned
It means all fields and outers are set. For performance, we don't check outers here, because Scala semantics ensure that they are always set before any user code in the constructor.
Note that isFullyFilled = true
does not mean we can use the object freely, as its fields or outers may still reach uninitialized objects.
Attributes
Handle a new expression new p.C
where p
is abstracted by value
Handle a new expression new p.C
where p
is abstracted by value
Attributes
Can the method call on value
be ignored?
Can the method call on value
be ignored?
Note: assume overriding resolution has been performed.
Attributes
Try early promotion of warm objects
Try early promotion of warm objects
Promotion is expensive and should only be performed for small classes.
-
for each concrete method
m
of the warm object: call the method and promote the result -
for each concrete field
f
of the warm object: promote the field value
If the object contains nested classes as members, the checker simply reports a warning to avoid expensive checks.