Dotty Documentation

0.1.1-bin-SNAPSHOT

class LazyVals
extends MiniPhaseTransform with IdentityDenotTransformer

[-] Constructors

LazyVals ( )

[-] Members

[+] class OffsetInfo

this map contains mutable state of transformation: OffsetDefs to be appended to companion object definitions, and number of bits currently used

[+] val appendOffsetDefs : Map [ Symbol, OffsetInfo ]
[+] val containerFlags : FlagSet
[+] val containerFlagsMask : FlagSet
[+] val initFlags : FlagSet
[+] private def addInFront ( prefix: List [ Tree ] , stats: List [ Tree ] ) : List [ A ]
[+] def mkDefNonThreadSafeNonNullable ( target: Symbol , rhs: Tree ) ( implicit ctx: Context ) : If

Create non-threadsafe lazy accessor for not-nullable types equivalent to such code def methodSymbol() = { if (target eq null) { target = rhs target } else target }

[+] def mkNonThreadSafeDef ( target: Tree , flag: Tree , rhs: Tree ) ( implicit ctx: Context ) : If
[+] def mkThreadSafeDef ( methodSymbol: TermSymbol , claz: ClassSymbol , ord: Int , target: Symbol , rhs: Tree , tp: Type , offset: Tree , getFlag: Tree , stateMask: Tree , casFlag: Tree , setFlagState: Tree , waitOnLock: Tree ) ( implicit ctx: Context ) : DefDef

Create a threadsafe lazy accessor equivalent to such code

def methodSymbol(): Int = { val result: Int = 0 val retry: Boolean = true var flag: Long = 0L while retry do { flag = dotty.runtime.LazyVals.get(this, $claz.$OFFSET) dotty.runtime.LazyVals.STATE(flag, 0) match { case 0 => if dotty.runtime.LazyVals.CAS(this, $claz.$OFFSET, flag, 1, $ord) { try {result = rhs} catch { case x: Throwable => dotty.runtime.LazyVals.setFlag(this, $claz.$OFFSET, 0, $ord) throw x } $target = result dotty.runtime.LazyVals.setFlag(this, $claz.$OFFSET, 3, $ord) retry = false } case 1 => dotty.runtime.LazyVals.wait4Notification(this, $claz.$OFFSET, flag, $ord) case 2 => dotty.runtime.LazyVals.wait4Notification(this, $claz.$OFFSET, flag, $ord) case 3 => retry = false result = $target } } result }

[+] override def phaseName : String

A name given to the Phase that can be used to debug the compiler. For instance, it is possible to print trees after a given phase using:

$ ./bin/dotc -Xprint:<phaseNameHere> sourceFile.scala
[+] override def runsAfter : Set [ Class [ Nothing <: Phase ] ]

List of names of phases that should have finished processing of tree before this phase starts processing same tree

[+] override def transformDefDef ( tree: DefDef ) ( implicit ctx: Context , info: TransformerInfo ) : Tree
[+] def transformLazyVal ( tree: ValOrDefDef ) ( implicit ctx: Context , info: TransformerInfo ) : Tree
[+] def transformLocalDef ( x: ValOrDefDef ) ( implicit ctx: Context ) : Thicket

Replace a local lazy val inside a method, with a LazyHolder from dotty.runtime(eg dotty.runtime.LazyInt)

[+] def transformMemberDefNonVolatile ( x: ValOrDefDef ) ( implicit ctx: Context ) : Thicket
[+] def transformMemberDefVolatile ( x: ValOrDefDef ) ( implicit ctx: Context ) : Thicket
[+] override def transformStats ( trees: List [ Tree ] ) ( implicit ctx: Context , info: TransformerInfo ) : List [ Tree ]
[+] def transformSyntheticModule ( tree: ValOrDefDef ) ( implicit ctx: Context ) : Thicket

Make an eager val that would implement synthetic module. Eager val ensures thread safety and has less code generated.

[+] override def transformTemplate ( template: Template ) ( implicit ctx: Context , info: TransformerInfo ) : Tree

Append offset fields to companion objects

[+] override def transformValDef ( tree: ValDef ) ( implicit ctx: Context , info: TransformerInfo ) : Tree
[+] def transformer : LazyVals