Skip to content

Commit a0dd4ca

Browse files
committed
Fix invalid flags in lazy vals.
1 parent 54034c1 commit a0dd4ca

File tree

1 file changed

+15
-10
lines changed

1 file changed

+15
-10
lines changed

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

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ class LazyValTranformContext {
4545

4646
def transformer = new LazyValsTransform
4747

48+
val containerFlags = Flags.Synthetic | Flags.Mutable
49+
4850
/** this map contains mutable state of transformation: OffsetDefs to be appended to companion object definitions,
4951
* and number of bits currently used */
5052
class OffsetInfo(var defs: List[Tree], var ord:Int)
@@ -140,9 +142,12 @@ class LazyValTranformContext {
140142

141143
val holderImpl = ctx.requiredClass("dotty.runtime." + holderType)
142144

143-
val holderSymbol = ctx.newSymbol(x.symbol.owner, holderName, Flags.Synthetic, holderImpl.typeRef, coord = x.symbol.coord)
145+
val holderSymbol = ctx.newSymbol(x.symbol.owner, holderName, containerFlags, holderImpl.typeRef, coord = x.symbol.coord)
144146
val holderTree = ValDef(holderSymbol, New(holderImpl.typeRef, List(valueInitter)))
145-
val methodTree = DefDef(x.symbol.asTerm, Select(Ident(holderSymbol.termRef), "value".toTermName))
147+
val methodBody =
148+
if(holderType != "LazyRef") Select(Ident(holderSymbol.termRef), "value".toTermName)
149+
else TypeApply(Select(Select(Ident(holderSymbol.termRef), "value".toTermName), defn.Any_asInstanceOf), List(TypeTree(tpe)))
150+
val methodTree = DefDef(x.symbol.asTerm, methodBody)
146151
ctx.debuglog(s"found a lazy val ${x.show},\n rewrote with ${holderTree.show}")
147152
Thicket(holderTree, methodTree)
148153
}
@@ -201,7 +206,7 @@ class LazyValTranformContext {
201206
val tpe = x.tpe.widen
202207
assert(!(mods is Flags.Mutable))
203208
val containerName = ctx.freshName(name.toString + StdNames.nme.LAZY_LOCAL).toTermName
204-
val containerSymbol = ctx.newSymbol(claz, containerName, (mods &~ Flags.Lazy & Flags.Synthetic).flags, tpe, coord = x.symbol.coord)
209+
val containerSymbol = ctx.newSymbol(claz, containerName, (mods &~ Flags.Lazy | containerFlags).flags, tpe, coord = x.symbol.coord)
205210
addSym(claz, containerSymbol)
206211

207212
val containerTree = ValDef(containerSymbol, Literal(initValue(tpe)))
@@ -211,7 +216,7 @@ class LazyValTranformContext {
211216
}
212217
else {
213218
val flagName = ctx.freshName(name.toString + StdNames.nme.BITMAP_PREFIX).toTermName
214-
val flagSymbol = ctx.newSymbol(x.symbol.owner, flagName, Flags.Synthetic, defn.BooleanType)
219+
val flagSymbol = ctx.newSymbol(x.symbol.owner, flagName, containerFlags, defn.BooleanType)
215220
val flag = ValDef(flagSymbol, Literal(Constants.Constant(false)))
216221
val slowPath = DefDef(x.symbol.asTerm, mkNonThreadSafeDef(containerSymbol, flagSymbol, rhs))
217222
Thicket(List(containerTree, flag, slowPath))
@@ -256,15 +261,15 @@ class LazyValTranformContext {
256261
val computeState = Literal(Constants.Constant(1))
257262
val notifyState = Literal(Constants.Constant(2))
258263
val computedState = Literal(Constants.Constant(3))
259-
val flagSymbol = ctx.newSymbol(methodSymbol, "flag".toTermName, Flags.Mutable & Flags.Synthetic, defn.LongType)
264+
val flagSymbol = ctx.newSymbol(methodSymbol, "flag".toTermName, containerFlags, defn.LongType)
260265
val flagDef = ValDef(flagSymbol, Literal(Constant(0L)))
261266

262267
val thiz = This(claz)(ctx.fresh.setOwner(claz))
263268

264-
val resultSymbol = ctx.newSymbol(methodSymbol, "result".toTermName, Flags.Mutable & Flags.Synthetic, tp)
269+
val resultSymbol = ctx.newSymbol(methodSymbol, "result".toTermName, containerFlags, tp)
265270
val resultDef = ValDef(resultSymbol, Literal(initValue(tp.widen)))
266271

267-
val retrySymbol = ctx.newSymbol(methodSymbol, "retry".toTermName, Flags.Mutable & Flags.Synthetic, defn.BooleanType)
272+
val retrySymbol = ctx.newSymbol(methodSymbol, "retry".toTermName, containerFlags, defn.BooleanType)
268273
val retryDef = ValDef(retrySymbol, Literal(Constants.Constant(true)))
269274

270275
val whileCond = Ident(retrySymbol.termRef)
@@ -345,7 +350,7 @@ class LazyValTranformContext {
345350
} else { // need to create a new flag
346351
offsetSymbol = ctx.newSymbol(companion.moduleClass, (StdNames.nme.LAZY_FIELD_OFFSET + id.toString).toTermName, Flags.Synthetic, defn.LongType).entered
347352
val flagName = (StdNames.nme.BITMAP_PREFIX + id.toString).toTermName
348-
val flagSymbol = ctx.newSymbol(claz, flagName, Flags.Synthetic, defn.LongType)
353+
val flagSymbol = ctx.newSymbol(claz, flagName, containerFlags, defn.LongType)
349354
addSym(claz, flagSymbol)
350355
flag = ValDef(flagSymbol, Literal(Constants.Constant(0L)))
351356
val offsetTree = ValDef(offsetSymbol, Apply(getOffset, List(thiz, Literal(Constant(flagName.toString)))))
@@ -355,15 +360,15 @@ class LazyValTranformContext {
355360
case None =>
356361
offsetSymbol = ctx.newSymbol(companion.moduleClass, (StdNames.nme.LAZY_FIELD_OFFSET + "0").toTermName, Flags.Synthetic, defn.LongType).entered
357362
val flagName = (StdNames.nme.BITMAP_PREFIX + "0").toTermName
358-
val flagSymbol = ctx.newSymbol(claz, flagName, Flags.Synthetic, defn.LongType)
363+
val flagSymbol = ctx.newSymbol(claz, flagName, containerFlags, defn.LongType)
359364
addSym(claz, flagSymbol)
360365
flag = ValDef(flagSymbol, Literal(Constants.Constant(0L)))
361366
val offsetTree = ValDef(offsetSymbol, Apply(getOffset, List(thiz, Literal(Constant(flagName.toString)))))
362367
appendOffsetDefs += (companion.name.moduleClassName -> new OffsetInfo(List(offsetTree), ord))
363368
}
364369

365370
val containerName = ctx.freshName(name.toString + StdNames.nme.LAZY_LOCAL).toTermName
366-
val containerSymbol = ctx.newSymbol(claz, containerName, (mods &~ Flags.Lazy & Flags.Synthetic).flags, tpe, coord = x.symbol.coord)
371+
val containerSymbol = ctx.newSymbol(claz, containerName, (mods &~ Flags.Lazy | containerFlags).flags, tpe, coord = x.symbol.coord)
367372
addSym(claz, containerSymbol)
368373
val containerTree = ValDef(containerSymbol, Literal(initValue(tpe)))
369374

0 commit comments

Comments
 (0)