summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
authorHubert Plociniczak <hubert.plociniczak@epfl.ch>2011-05-11 12:11:08 +0000
committerHubert Plociniczak <hubert.plociniczak@epfl.ch>2011-05-11 12:11:08 +0000
commit28149691dae4d73da676d54235e68feacd11c8f8 (patch)
treed4e155cd63462739c1fe92f8bea94cdf11915197 /src/compiler
parent124cf3f9cbdc582a432c13edd229ba9b8726b99f (diff)
downloadscala-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.scala7
-rw-r--r--src/compiler/scala/tools/nsc/transform/Mixin.scala14
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