Skip to content

Commit 688feee

Browse files
committed
Address review comments.
1 parent 8f47f16 commit 688feee

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

src/dotty/tools/dotc/transform/LazyVals.scala

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,12 @@ class LazyVals extends MiniPhaseTransform with IdentityDenotTransformer {
6363

6464
if (isField) {
6565
if (sym.isVolatile ||
66-
(sym.is(Flags.Module) && !sym.is(Flags.Synthetic))) // companion class is synthesized. Should be threadsafe to
67-
// make inner lazy vals thread safe
66+
(sym.is(Flags.Module) && !sym.is(Flags.Synthetic)))
67+
// module class is user-defined.
68+
// Should be threadsafe, to mimic safety guaranteed by global object
6869
transformMemberDefVolatile(tree)
6970
else if (sym.is(Flags.Module)) { // synthetic module
70-
val holderSymbol = ctx.newSymbol(sym.owner, sym.asTerm.name ++ nme.LAZY_LOCAL,
71-
Flags.Synthetic, sym.info.widen.resultType).enteredAfter(this)
72-
val field = ValDef(holderSymbol, tree.rhs.changeOwnerAfter(sym, holderSymbol, this))
73-
val getter = DefDef(sym.asTerm, ref(holderSymbol))
74-
Thicket(field, getter)
71+
transformSyntheticModule(tree)
7572
}
7673
else transformMemberDefNonVolatile(tree)
7774
}
@@ -98,6 +95,19 @@ class LazyVals extends MiniPhaseTransform with IdentityDenotTransformer {
9895
case _ => prefix ::: stats
9996
}
10097

98+
/** Make an eager val that would implement synthetic module.
99+
* Eager val ensures thread safety and has less code generated.
100+
*
101+
*/
102+
def transformSyntheticModule(tree: ValOrDefDef)(implicit ctx: Context) = {
103+
val sym = tree.symbol
104+
val holderSymbol = ctx.newSymbol(sym.owner, sym.asTerm.name ++ nme.LAZY_LOCAL,
105+
Flags.Synthetic, sym.info.widen.resultType).enteredAfter(this)
106+
val field = ValDef(holderSymbol, tree.rhs.changeOwnerAfter(sym, holderSymbol, this))
107+
val getter = DefDef(sym.asTerm, ref(holderSymbol))
108+
Thicket(field, getter)
109+
}
110+
101111
/** Replace a local lazy val inside a method,
102112
* with a LazyHolder from
103113
* dotty.runtime(eg dotty.runtime.LazyInt)

0 commit comments

Comments
 (0)