@@ -45,6 +45,8 @@ class LazyValTranformContext {
45
45
46
46
def transformer = new LazyValsTransform
47
47
48
+ val containerFlags = Flags .Synthetic | Flags .Mutable
49
+
48
50
/** this map contains mutable state of transformation: OffsetDefs to be appended to companion object definitions,
49
51
* and number of bits currently used */
50
52
class OffsetInfo (var defs : List [Tree ], var ord : Int )
@@ -140,9 +142,12 @@ class LazyValTranformContext {
140
142
141
143
val holderImpl = ctx.requiredClass(" dotty.runtime." + holderType)
142
144
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)
144
146
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)
146
151
ctx.debuglog(s " found a lazy val ${x.show}, \n rewrote with ${holderTree.show}" )
147
152
Thicket (holderTree, methodTree)
148
153
}
@@ -201,7 +206,7 @@ class LazyValTranformContext {
201
206
val tpe = x.tpe.widen
202
207
assert(! (mods is Flags .Mutable ))
203
208
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)
205
210
addSym(claz, containerSymbol)
206
211
207
212
val containerTree = ValDef (containerSymbol, Literal (initValue(tpe)))
@@ -211,7 +216,7 @@ class LazyValTranformContext {
211
216
}
212
217
else {
213
218
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 )
215
220
val flag = ValDef (flagSymbol, Literal (Constants .Constant (false )))
216
221
val slowPath = DefDef (x.symbol.asTerm, mkNonThreadSafeDef(containerSymbol, flagSymbol, rhs))
217
222
Thicket (List (containerTree, flag, slowPath))
@@ -256,15 +261,15 @@ class LazyValTranformContext {
256
261
val computeState = Literal (Constants .Constant (1 ))
257
262
val notifyState = Literal (Constants .Constant (2 ))
258
263
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 )
260
265
val flagDef = ValDef (flagSymbol, Literal (Constant (0L )))
261
266
262
267
val thiz = This (claz)(ctx.fresh.setOwner(claz))
263
268
264
- val resultSymbol = ctx.newSymbol(methodSymbol, " result" .toTermName, Flags . Mutable & Flags . Synthetic , tp)
269
+ val resultSymbol = ctx.newSymbol(methodSymbol, " result" .toTermName, containerFlags , tp)
265
270
val resultDef = ValDef (resultSymbol, Literal (initValue(tp.widen)))
266
271
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 )
268
273
val retryDef = ValDef (retrySymbol, Literal (Constants .Constant (true )))
269
274
270
275
val whileCond = Ident (retrySymbol.termRef)
@@ -345,7 +350,7 @@ class LazyValTranformContext {
345
350
} else { // need to create a new flag
346
351
offsetSymbol = ctx.newSymbol(companion.moduleClass, (StdNames .nme.LAZY_FIELD_OFFSET + id.toString).toTermName, Flags .Synthetic , defn.LongType ).entered
347
352
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 )
349
354
addSym(claz, flagSymbol)
350
355
flag = ValDef (flagSymbol, Literal (Constants .Constant (0L )))
351
356
val offsetTree = ValDef (offsetSymbol, Apply (getOffset, List (thiz, Literal (Constant (flagName.toString)))))
@@ -355,15 +360,15 @@ class LazyValTranformContext {
355
360
case None =>
356
361
offsetSymbol = ctx.newSymbol(companion.moduleClass, (StdNames .nme.LAZY_FIELD_OFFSET + " 0" ).toTermName, Flags .Synthetic , defn.LongType ).entered
357
362
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 )
359
364
addSym(claz, flagSymbol)
360
365
flag = ValDef (flagSymbol, Literal (Constants .Constant (0L )))
361
366
val offsetTree = ValDef (offsetSymbol, Apply (getOffset, List (thiz, Literal (Constant (flagName.toString)))))
362
367
appendOffsetDefs += (companion.name.moduleClassName -> new OffsetInfo (List (offsetTree), ord))
363
368
}
364
369
365
370
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)
367
372
addSym(claz, containerSymbol)
368
373
val containerTree = ValDef (containerSymbol, Literal (initValue(tpe)))
369
374
0 commit comments