diff options
author | Hubert Plociniczak <hubert.plociniczak@epfl.ch> | 2011-05-11 12:11:08 +0000 |
---|---|---|
committer | Hubert Plociniczak <hubert.plociniczak@epfl.ch> | 2011-05-11 12:11:08 +0000 |
commit | 28149691dae4d73da676d54235e68feacd11c8f8 (patch) | |
tree | d4e155cd63462739c1fe92f8bea94cdf11915197 /src/compiler | |
parent | 124cf3f9cbdc582a432c13edd229ba9b8726b99f (diff) | |
download | scala-28149691dae4d73da676d54235e68feacd11c8f8.tar.gz scala-28149691dae4d73da676d54235e68feacd11c8f8.tar.bz2 scala-28149691dae4d73da676d54235e68feacd11c8f8.zip |
Closes #4565.
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/scala/tools/nsc/ast/TreeGen.scala | 7 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/Mixin.scala | 14 |
2 files changed, 14 insertions, 7 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/TreeGen.scala b/src/compiler/scala/tools/nsc/ast/TreeGen.scala index 406d819147..af2ebc4251 100644 --- a/src/compiler/scala/tools/nsc/ast/TreeGen.scala +++ b/src/compiler/scala/tools/nsc/ast/TreeGen.scala @@ -426,11 +426,14 @@ abstract class TreeGen { * The idiom works only if the condition is using a volatile field. * @see http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html */ - def mkDoubleCheckedLocking(clazz: Symbol, cond: Tree, syncBody: List[Tree], stats: List[Tree]): Tree = { + def mkDoubleCheckedLocking(clazz: Symbol, cond: Tree, syncBody: List[Tree], stats: List[Tree]): Tree = + mkDoubleCheckedLocking(mkAttributedThis(clazz), cond, syncBody, stats) + + def mkDoubleCheckedLocking(attrThis: Tree, cond: Tree, syncBody: List[Tree], stats: List[Tree]): Tree = { If(cond, Block( mkSynchronized( - mkAttributedThis(clazz), + attrThis, If(cond, Block(syncBody: _*), EmptyTree)) :: stats: _*), EmptyTree) diff --git a/src/compiler/scala/tools/nsc/transform/Mixin.scala b/src/compiler/scala/tools/nsc/transform/Mixin.scala index 406e97bb8c..ac4f19f69d 100644 --- a/src/compiler/scala/tools/nsc/transform/Mixin.scala +++ b/src/compiler/scala/tools/nsc/transform/Mixin.scala @@ -828,12 +828,12 @@ abstract class Mixin extends InfoTransform with ast.TreeDSL { typedPos(init.head.pos)(BLOCK(result, retVal)) } - def mkInnerClassAccessorDoubleChecked(clazz: Symbol, rhs: Tree): Tree = + def mkInnerClassAccessorDoubleChecked(attrThis: Tree, rhs: Tree): Tree = rhs match { case Block(List(assign), returnTree) => val Assign(moduleVarRef, _) = assign val cond = Apply(Select(moduleVarRef, nme.eq),List(Literal(Constant(null)))) - val doubleSynchrTree = gen.mkDoubleCheckedLocking(clazz, cond, List(assign), Nil) + val doubleSynchrTree = gen.mkDoubleCheckedLocking(attrThis, cond, List(assign), Nil) Block(List(doubleSynchrTree), returnTree) case _ => assert(false, "Invalid getter " + rhs + " for module in class " + clazz) @@ -890,8 +890,11 @@ abstract class Mixin extends InfoTransform with ast.TreeDSL { else stat case DefDef(mods, name, tp, vp, tpt, rhs) - if sym.isModule && !clazz.isTrait && !sym.hasFlag(BRIDGE) => - val rhs1 = mkInnerClassAccessorDoubleChecked(clazz, rhs) + if sym.isModule && (!clazz.isTrait || clazz.isImplClass) && !sym.hasFlag(BRIDGE) => + val attrThis = + if (clazz.isImplClass) gen.mkAttributedIdent(vp.head.head.symbol) + else gen.mkAttributedThis(clazz) + val rhs1 = mkInnerClassAccessorDoubleChecked(attrThis, rhs) treeCopy.DefDef(stat, mods, name, tp, vp, tpt, typedPos(stat.pos)(rhs1)) case _ => stat } @@ -1090,7 +1093,8 @@ abstract class Mixin extends InfoTransform with ast.TreeDSL { val rhs = gen.newModule(sym, vdef.symbol.tpe) val assignAndRet = gen.mkAssignAndReturn(vdef.symbol, rhs) - val rhs1 = mkInnerClassAccessorDoubleChecked(clazz, assignAndRet) + val attrThis = gen.mkAttributedThis(clazz) + val rhs1 = mkInnerClassAccessorDoubleChecked(attrThis, assignAndRet) addDef(position(sym), DefDef(sym, rhs1)) } else if (!sym.isMethod) { // add fields |