1
- package dotty .tools .dotc
2
- package transform
1
+ package dotty .tools .dotc .transform
3
2
4
- import dotty . tools . dotc . core . Annotations . Annotation
3
+ import java . util . IdentityHashMap
5
4
6
- import scala .collection .mutable
7
- import core ._
8
- import Contexts ._
9
- import Symbols ._
10
- import Decorators ._
11
- import NameKinds ._
12
- import Types ._
13
- import Flags ._
14
- import StdNames .nme
15
- import dotty .tools .dotc .transform .MegaPhase ._
16
5
import dotty .tools .dotc .ast .tpd
6
+ import dotty .tools .dotc .core .Annotations .Annotation
17
7
import dotty .tools .dotc .core .Constants .Constant
18
- import dotty .tools .dotc .core .Types . MethodType
19
- import SymUtils ._
8
+ import dotty .tools .dotc .core .Contexts . Context
9
+ import dotty . tools . dotc . core . Decorators ._
20
10
import dotty .tools .dotc .core .DenotTransformers .IdentityDenotTransformer
21
- import Erasure .Boxing .adaptToType
11
+ import dotty .tools .dotc .core .Flags ._
12
+ import dotty .tools .dotc .core .NameKinds .{LazyBitMapName , LazyLocalInitName , LazyLocalName }
13
+ import dotty .tools .dotc .core .StdNames .nme
14
+ import dotty .tools .dotc .core .Symbols ._
15
+ import dotty .tools .dotc .core .Types ._
16
+ import dotty .tools .dotc .core .{Names , StdNames }
17
+ import dotty .tools .dotc .transform .MegaPhase .MiniPhase
18
+ import dotty .tools .dotc .transform .SymUtils ._
22
19
23
- import java . util . IdentityHashMap
20
+ import scala . collection . mutable
24
21
25
22
class LazyVals extends MiniPhase with IdentityDenotTransformer {
26
23
import LazyVals ._
@@ -41,10 +38,10 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
41
38
42
39
def transformer : LazyVals = new LazyVals
43
40
44
- val containerFlags : FlagSet = Flags . Synthetic | Flags . Mutable | Flags . Lazy
45
- val initFlags : FlagSet = Flags . Synthetic | Flags . Method
41
+ val containerFlags : FlagSet = Synthetic | Mutable | Lazy
42
+ val initFlags : FlagSet = Synthetic | Method
46
43
47
- val containerFlagsMask : FlagSet = Flags . Method | Flags . Lazy | Flags . Accessor | Flags . Module
44
+ val containerFlagsMask : FlagSet = Method | Lazy | Accessor | Module
48
45
49
46
/** A map of lazy values to the fields they should null after initialization. */
50
47
private [this ] var lazyValNullables : IdentityHashMap [Symbol , mutable.ListBuffer [Symbol ]] = _
@@ -72,22 +69,22 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
72
69
73
70
def transformLazyVal (tree : ValOrDefDef )(implicit ctx : Context ): Tree = {
74
71
val sym = tree.symbol
75
- if (! (sym is Flags . Lazy ) ||
76
- sym.owner.is(Flags . Trait ) || // val is accessor, lazy field will be implemented in subclass
77
- (sym.isStatic && sym.is(Flags . Module , butNot = Flags . Method ))) // static module vals are implemented in the JVM by lazy loading
72
+ if (! (sym is Lazy ) ||
73
+ sym.owner.is(Trait ) || // val is accessor, lazy field will be implemented in subclass
74
+ (sym.isStatic && sym.is(Module , butNot = Method ))) // static module vals are implemented in the JVM by lazy loading
78
75
tree
79
76
else {
80
77
val isField = sym.owner.isClass
81
78
if (isField) {
82
79
if (sym.isVolatile ||
83
- (sym.is(Flags . Module )/* || ctx.scala2Mode*/ ) &&
80
+ (sym.is(Module )/* || ctx.scala2Mode*/ ) &&
84
81
// TODO assume @volatile once LazyVals uses static helper constructs instead of
85
82
// ones in the companion object.
86
- ! sym.is(Flags . Synthetic ))
83
+ ! sym.is(Synthetic ))
87
84
// module class is user-defined.
88
85
// Should be threadsafe, to mimic safety guaranteed by global object
89
86
transformMemberDefVolatile(tree)
90
- else if (sym.is(Flags . Module )) // synthetic module
87
+ else if (sym.is(Module )) // synthetic module
91
88
transformSyntheticModule(tree)
92
89
else
93
90
transformMemberDefNonVolatile(tree)
@@ -123,7 +120,7 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
123
120
def transformSyntheticModule (tree : ValOrDefDef )(implicit ctx : Context ): Thicket = {
124
121
val sym = tree.symbol
125
122
val holderSymbol = ctx.newSymbol(sym.owner, LazyLocalName .fresh(sym.asTerm.name),
126
- Flags . Synthetic , sym.info.widen.resultType).enteredAfter(this )
123
+ Synthetic , sym.info.widen.resultType).enteredAfter(this )
127
124
val field = ValDef (holderSymbol, tree.rhs.changeOwnerAfter(sym, holderSymbol, this ))
128
125
val getter = DefDef (sym.asTerm, ref(holderSymbol))
129
126
Thicket (field, getter)
@@ -187,8 +184,8 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
187
184
// need to bring containers to start of method
188
185
val (holders, stats) =
189
186
trees.partition {
190
- _.symbol.flags.&~ (Flags . Touched ) == containerFlags
191
- // Filtering out Flags. Touched is not required currently, as there are no LazyTypes involved here
187
+ _.symbol.flags.&~ (Touched ) == containerFlags
188
+ // Filtering out Touched is not required currently, as there are no LazyTypes involved here
192
189
// but just to be more safe
193
190
}
194
191
holders::: stats
@@ -198,7 +195,7 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
198
195
val nullConst = Literal (Constant (null ))
199
196
nullables.map { field =>
200
197
assert(field.isField)
201
- field.setFlag(Flags . Mutable )
198
+ field.setFlag(Mutable )
202
199
ref(field).becomes(nullConst)
203
200
}
204
201
}
@@ -252,10 +249,10 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
252
249
def transformMemberDefNonVolatile (x : ValOrDefDef )(implicit ctx : Context ): Thicket = {
253
250
val claz = x.symbol.owner.asClass
254
251
val tpe = x.tpe.widen.resultType.widen
255
- assert(! (x.symbol is Flags . Mutable ))
252
+ assert(! (x.symbol is Mutable ))
256
253
val containerName = LazyLocalName .fresh(x.name.asTermName)
257
254
val containerSymbol = ctx.newSymbol(claz, containerName,
258
- x.symbol.flags &~ containerFlagsMask | containerFlags | Flags . Private ,
255
+ x.symbol.flags &~ containerFlagsMask | containerFlags | Private ,
259
256
tpe, coord = x.symbol.coord
260
257
).enteredAfter(this )
261
258
@@ -266,7 +263,7 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
266
263
}
267
264
else {
268
265
val flagName = LazyBitMapName .fresh(x.name.asTermName)
269
- val flagSymbol = ctx.newSymbol(x.symbol.owner, flagName, containerFlags | Flags . Private , defn.BooleanType ).enteredAfter(this )
266
+ val flagSymbol = ctx.newSymbol(x.symbol.owner, flagName, containerFlags | Private , defn.BooleanType ).enteredAfter(this )
270
267
val flag = ValDef (flagSymbol, Literal (Constant (false )))
271
268
Thicket (containerTree, flag, mkNonThreadSafeDef(x.symbol, flagSymbol, containerSymbol, x.rhs))
272
269
}
@@ -314,13 +311,12 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
314
311
stateMask : Tree ,
315
312
casFlag : Tree ,
316
313
setFlagState : Tree ,
317
- waitOnLock : Tree ,
318
- nullables : List [Symbol ])(implicit ctx : Context ): DefDef = {
314
+ waitOnLock : Tree )(implicit ctx : Context ): DefDef = {
319
315
val initState = Literal (Constant (0 ))
320
316
val computeState = Literal (Constant (1 ))
321
317
val computedState = Literal (Constant (3 ))
322
318
323
- val thiz = This (claz)(ctx.fresh.setOwner(claz))
319
+ val thiz = This (claz)
324
320
val fieldId = Literal (Constant (ord))
325
321
326
322
val flagSymbol = ctx.newSymbol(methodSymbol, lazyNme.flag, Synthetic , defn.LongType )
@@ -344,7 +340,7 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
344
340
}
345
341
346
342
val retryCase = {
347
- val caseSymbol = ctx.newSymbol(methodSymbol, nme.DEFAULT_EXCEPTION_NAME , Flags . Synthetic , defn.ThrowableType )
343
+ val caseSymbol = ctx.newSymbol(methodSymbol, nme.DEFAULT_EXCEPTION_NAME , Synthetic , defn.ThrowableType )
348
344
val triggerRetry = setFlagState.appliedTo(thiz, offset, initState, fieldId)
349
345
CaseDef (
350
346
Bind (caseSymbol, ref(caseSymbol)),
@@ -374,7 +370,7 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
374
370
}
375
371
376
372
def transformMemberDefVolatile (x : ValOrDefDef )(implicit ctx : Context ): Thicket = {
377
- assert(! (x.symbol is Flags . Mutable ))
373
+ assert(! (x.symbol is Mutable ))
378
374
379
375
val tpe = x.tpe.widen.resultType.widen
380
376
val claz = x.symbol.owner.asClass
@@ -385,9 +381,9 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
385
381
var flag : Tree = EmptyTree
386
382
var ord = 0
387
383
388
- def offsetName (id : Int ) = (StdNames .nme.LAZY_FIELD_OFFSET + (if (x.symbol.owner.is(Flags . Module )) " _m_" else " " ) + id.toString).toTermName
384
+ def offsetName (id : Int ) = (StdNames .nme.LAZY_FIELD_OFFSET + (if (x.symbol.owner.is(Module )) " _m_" else " " ) + id.toString).toTermName
389
385
390
- // compute or create appropriate offsetSymol , bitmap and bits used by current ValDef
386
+ // compute or create appropriate offsetSymbol , bitmap and bits used by current ValDef
391
387
appendOffsetDefs.get(claz) match {
392
388
case Some (info) =>
393
389
val flagsPerLong = (64 / dotty.runtime.LazyVals .BITS_PER_LAZY_VAL ).toInt
@@ -397,10 +393,10 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
397
393
val offsetById = offsetName(id)
398
394
if (ord != 0 ) { // there are unused bits in already existing flag
399
395
offsetSymbol = claz.info.decl(offsetById)
400
- .suchThat(sym => (sym is Flags . Synthetic ) && sym.isTerm)
396
+ .suchThat(sym => (sym is Synthetic ) && sym.isTerm)
401
397
.symbol.asTerm
402
398
} else { // need to create a new flag
403
- offsetSymbol = ctx.newSymbol(claz, offsetById, Flags . Synthetic , defn.LongType ).enteredAfter(this )
399
+ offsetSymbol = ctx.newSymbol(claz, offsetById, Synthetic , defn.LongType ).enteredAfter(this )
404
400
offsetSymbol.addAnnotation(Annotation (defn.ScalaStaticAnnot ))
405
401
val flagName = (StdNames .nme.BITMAP_PREFIX + id.toString).toTermName
406
402
val flagSymbol = ctx.newSymbol(claz, flagName, containerFlags, defn.LongType ).enteredAfter(this )
@@ -410,7 +406,7 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
410
406
}
411
407
412
408
case None =>
413
- offsetSymbol = ctx.newSymbol(claz, offsetName(0 ), Flags . Synthetic , defn.LongType ).enteredAfter(this )
409
+ offsetSymbol = ctx.newSymbol(claz, offsetName(0 ), Synthetic , defn.LongType ).enteredAfter(this )
414
410
offsetSymbol.addAnnotation(Annotation (defn.ScalaStaticAnnot ))
415
411
val flagName = (StdNames .nme.BITMAP_PREFIX + " 0" ).toTermName
416
412
val flagSymbol = ctx.newSymbol(claz, flagName, containerFlags, defn.LongType ).enteredAfter(this )
@@ -430,9 +426,8 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
430
426
val wait = Select (ref(helperModule), lazyNme.RLazyVals .wait4Notification)
431
427
val state = Select (ref(helperModule), lazyNme.RLazyVals .state)
432
428
val cas = Select (ref(helperModule), lazyNme.RLazyVals .cas)
433
- val nullables = nullableFor(x.symbol)
434
429
435
- val accessor = mkThreadSafeDef(x.symbol.asTerm, claz, ord, containerSymbol, x.rhs, tpe, offset, getFlag, state, cas, setFlag, wait, nullables )
430
+ val accessor = mkThreadSafeDef(x.symbol.asTerm, claz, ord, containerSymbol, x.rhs, tpe, offset, getFlag, state, cas, setFlag, wait)
436
431
if (flag eq EmptyTree )
437
432
Thicket (containerTree, accessor)
438
433
else Thicket (containerTree, flag, accessor)
0 commit comments