Skip to content

Commit 6c5beea

Browse files
committed
Remove code duplication in LazyVals.
Also fixes problem with capturedVars, as no local vars are created.
1 parent fdd53e1 commit 6c5beea

File tree

1 file changed

+7
-13
lines changed

1 file changed

+7
-13
lines changed

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

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package dotty.tools.dotc
22
package transform
33

4+
import dotty.tools.dotc.typer.Mode
5+
46
import scala.collection.mutable
57
import core._
68
import Contexts._
@@ -22,6 +24,7 @@ import dotty.tools.dotc.core.SymDenotations.SymDenotation
2224
import dotty.tools.dotc.core.DenotTransformers.{SymTransformer, IdentityDenotTransformer, DenotTransformer}
2325

2426
class LazyVals extends MiniPhaseTransform with IdentityDenotTransformer {
27+
import LazyVals._
2528

2629
import tpd._
2730

@@ -44,24 +47,15 @@ class LazyVals extends MiniPhaseTransform with IdentityDenotTransformer {
4447
override def runsAfter = Set(classOf[Mixin])
4548

4649
override def transformDefDef(tree: DefDef)(implicit ctx: Context, info: TransformerInfo): Tree = {
47-
if (!(tree.symbol is Flags.Lazy)) tree
50+
if (!(tree.symbol is Flags.Lazy) || tree.symbol.owner.is(Flags.Trait)) tree
4851
else {
49-
if (tree.symbol is Flags.Module) {
50-
val field = ctx.newSymbol(tree.symbol.owner, tree.symbol.name ++ StdNames.nme.MODULE_VAR_SUFFIX, containerFlags, tree.symbol.info.resultType, coord = tree.symbol.pos)
51-
val getter =
52-
tpd.DefDef(tree.symbol.asTerm, tpd.This(tree.symbol.enclosingClass.asClass).select(defn.Object_synchronized).appliedTo(
53-
mkDefNonThreadSafeNonNullable(field, tree.rhs).ensureConforms(tree.tpe.widen.resultType.widen)).ensureConforms(tree.tpe.widen.resultType.widen))
54-
val fieldVal = tpd.ValDef(field.asTerm, initValue(field.info.widen))
55-
Thicket(fieldVal, getter)
56-
} else {
5752
val isField = tree.symbol.owner.isClass
5853

5954
if (isField) {
60-
if (tree.symbol.isVolatile) transformFieldValDefVolatile(tree)
55+
if (tree.symbol.isVolatile || tree.symbol.is(Flags.Module)) transformFieldValDefVolatile(tree)
6156
else transformFieldValDefNonVolatile(tree)
6257
}
6358
else transformLocalValDef(tree)
64-
}
6559
}
6660
}
6761

@@ -279,8 +273,8 @@ class LazyVals extends MiniPhaseTransform with IdentityDenotTransformer {
279273
val cases = Match(stateMask.appliedTo(ref(flagSymbol), Literal(Constant(ord))),
280274
List(compute, waitFirst, waitSecond, computed, default)) //todo: annotate with @switch
281275

282-
val whileBody = Block(List(ref(flagSymbol).becomes(getFlag.appliedTo(thiz, offset))), cases)
283-
val cycle = untpd.WhileDo(whileCond, whileBody).withTypeUnchecked(defn.UnitType)
276+
val whileBody = List(ref(flagSymbol).becomes(getFlag.appliedTo(thiz, offset)), cases)
277+
val cycle = WhileDo(methodSymbol, whileCond, whileBody)
284278
DefDef(methodSymbol, Block(resultDef :: retryDef :: flagDef :: cycle :: Nil, ref(resultSymbol)))
285279
}
286280

0 commit comments

Comments
 (0)