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

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...

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

Create non-threadsafe lazy accessor equivalent to such code def methodSymbol() = { if (flag) target else { target = rhs flag = true target } }

Create non-threadsafe lazy accessor equivalent to such code def methodSymbol() = { if (flag) target else { target = rhs flag = true target } }

[+] 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 whi...

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:

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

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)

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.

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

Append offset fields to companion objects

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