@@ -63,15 +63,12 @@ class LazyVals extends MiniPhaseTransform with IdentityDenotTransformer {
63
63
64
64
if (isField) {
65
65
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
68
69
transformMemberDefVolatile(tree)
69
70
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)
75
72
}
76
73
else transformMemberDefNonVolatile(tree)
77
74
}
@@ -98,6 +95,19 @@ class LazyVals extends MiniPhaseTransform with IdentityDenotTransformer {
98
95
case _ => prefix ::: stats
99
96
}
100
97
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
+
101
111
/** Replace a local lazy val inside a method,
102
112
* with a LazyHolder from
103
113
* dotty.runtime(eg dotty.runtime.LazyInt)
0 commit comments