@@ -74,18 +74,12 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
7474 else {
7575 val isField = sym.owner.isClass
7676 if (isField) {
77- if (sym.isVolatile ||
78- (sym.is(Module )/* || ctx.scala2Mode*/ ) &&
79- // TODO assume @volatile once LazyVals uses static helper constructs instead of
80- // ones in the companion object.
81- ! sym.is(Synthetic ))
82- // module class is user-defined.
83- // Should be threadsafe, to mimic safety guaranteed by global object
84- transformMemberDefVolatile(tree)
85- else if (sym.is(Module )) // synthetic module
77+ if (sym.is(SyntheticModule ))
8678 transformSyntheticModule(tree)
79+ else if (! sym.isThreadUnsafe || sym.is(Module )) // @threadUnsafe object are not allowed
80+ transformMemberDefThreadSafe(tree)
8781 else
88- transformMemberDefNonVolatile (tree)
82+ transformMemberDefThreadUnsafe (tree)
8983 }
9084 else transformLocalDef(tree)
9185 }
@@ -196,7 +190,7 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
196190 ref(field).becomes(nullLiteral)
197191 }
198192
199- /** Create non-threadsafe lazy accessor equivalent to such code
193+ /** Create thread-unsafe lazy accessor equivalent to such code
200194 * ```
201195 * def methodSymbol() = {
202196 * if (!flag) {
@@ -208,7 +202,7 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
208202 * }
209203 * ```
210204 */
211- def mkNonThreadSafeDef (sym : Symbol , flag : Symbol , target : Symbol , rhs : Tree )(implicit ctx : Context ): DefDef = {
205+ def mkThreadUnsafeDef (sym : Symbol , flag : Symbol , target : Symbol , rhs : Tree )(implicit ctx : Context ): DefDef = {
212206 val targetRef = ref(target)
213207 val flagRef = ref(flag)
214208 val stats = targetRef.becomes(rhs) :: flagRef.becomes(Literal (Constant (true ))) :: nullOut(nullableFor(sym))
@@ -220,7 +214,7 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
220214 DefDef (sym.asTerm, Block (List (init), targetRef.ensureApplied))
221215 }
222216
223- /** Create non-threadsafe lazy accessor for not-nullable types equivalent to such code
217+ /** Create thread-unsafe lazy accessor for not-nullable types equivalent to such code
224218 * ```
225219 * def methodSymbol() = {
226220 * if (target eq null) {
@@ -231,7 +225,7 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
231225 * }
232226 * ```
233227 */
234- def mkDefNonThreadSafeNonNullable (sym : Symbol , target : Symbol , rhs : Tree )(implicit ctx : Context ): DefDef = {
228+ def mkDefThreadUnsafeNonNullable (sym : Symbol , target : Symbol , rhs : Tree )(implicit ctx : Context ): DefDef = {
235229 val targetRef = ref(target)
236230 val stats = targetRef.becomes(rhs) :: nullOut(nullableFor(sym))
237231 val init = If (
@@ -242,7 +236,7 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
242236 DefDef (sym.asTerm, Block (List (init), targetRef.ensureApplied))
243237 }
244238
245- def transformMemberDefNonVolatile (x : ValOrDefDef )(implicit ctx : Context ): Thicket = {
239+ def transformMemberDefThreadUnsafe (x : ValOrDefDef )(implicit ctx : Context ): Thicket = {
246240 val claz = x.symbol.owner.asClass
247241 val tpe = x.tpe.widen.resultType.widen
248242 assert(! (x.symbol is Mutable ))
@@ -255,13 +249,13 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
255249 val containerTree = ValDef (containerSymbol, defaultValue(tpe))
256250 if (x.tpe.isNotNull && tpe <:< defn.ObjectType ) {
257251 // can use 'null' value instead of flag
258- Thicket (containerTree, mkDefNonThreadSafeNonNullable (x.symbol, containerSymbol, x.rhs))
252+ Thicket (containerTree, mkDefThreadUnsafeNonNullable (x.symbol, containerSymbol, x.rhs))
259253 }
260254 else {
261255 val flagName = LazyBitMapName .fresh(x.name.asTermName)
262256 val flagSymbol = ctx.newSymbol(x.symbol.owner, flagName, containerFlags | Private , defn.BooleanType ).enteredAfter(this )
263257 val flag = ValDef (flagSymbol, Literal (Constant (false )))
264- Thicket (containerTree, flag, mkNonThreadSafeDef (x.symbol, flagSymbol, containerSymbol, x.rhs))
258+ Thicket (containerTree, flag, mkThreadUnsafeDef (x.symbol, flagSymbol, containerSymbol, x.rhs))
265259 }
266260 }
267261
@@ -365,7 +359,7 @@ class LazyVals extends MiniPhase with IdentityDenotTransformer {
365359 DefDef (methodSymbol, loop)
366360 }
367361
368- def transformMemberDefVolatile (x : ValOrDefDef )(implicit ctx : Context ): Thicket = {
362+ def transformMemberDefThreadSafe (x : ValOrDefDef )(implicit ctx : Context ): Thicket = {
369363 assert(! (x.symbol is Mutable ))
370364
371365 val tpe = x.tpe.widen.resultType.widen
0 commit comments