diff options
author | Hubert Plociniczak <hubert.plociniczak@epfl.ch> | 2010-10-20 13:26:02 +0000 |
---|---|---|
committer | Hubert Plociniczak <hubert.plociniczak@epfl.ch> | 2010-10-20 13:26:02 +0000 |
commit | de3e8492e61e02777520e8876e9e1bccb4b0f065 (patch) | |
tree | c125c022ff9c7e5249a3c31cfac1aa8997493a52 /src/compiler/scala/tools/nsc/transform/LambdaLift.scala | |
parent | 7a4b4c7a97b0b9417a82bc03ecac31ffe16cf40c (diff) | |
download | scala-de3e8492e61e02777520e8876e9e1bccb4b0f065.tar.gz scala-de3e8492e61e02777520e8876e9e1bccb4b0f065.tar.bz2 scala-de3e8492e61e02777520e8876e9e1bccb4b0f065.zip |
Closes #2910.
Diffstat (limited to 'src/compiler/scala/tools/nsc/transform/LambdaLift.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/LambdaLift.scala | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/LambdaLift.scala b/src/compiler/scala/tools/nsc/transform/LambdaLift.scala index 034dc04f3c..184065a7ed 100644 --- a/src/compiler/scala/tools/nsc/transform/LambdaLift.scala +++ b/src/compiler/scala/tools/nsc/transform/LambdaLift.scala @@ -155,7 +155,7 @@ abstract class LambdaLift extends InfoTransform { if (settings.debug.value) log("" + sym + " is free in " + owner); if ((sym.isVariable || (sym.isValue && sym.isLazy)) && !sym.hasFlag(CAPTURED)) { sym setFlag CAPTURED - val symClass = sym.tpe.typeSymbol; + val symClass = sym.tpe.typeSymbol atPhase(phase.next) { sym updateInfo ( if (sym.hasAnnotation(VolatileAttr)) @@ -433,7 +433,7 @@ abstract class LambdaLift extends InfoTransform { else if (sym.isLocal && !isSameOwnerEnclosure(sym)) atPos(tree.pos)(proxyRef(sym)) else tree - else tree; + else tree if (sym.isCapturedVariable) atPos(tree.pos) { val tp = tree.tpe @@ -441,6 +441,12 @@ abstract class LambdaLift extends InfoTransform { if (elemTree.tpe.typeSymbol != tp.typeSymbol) gen.mkAttributedCast(elemTree, tp) else elemTree } else tree1 + case Block(stats, expr0) => + val (lzyVals, rest) = stats.partition { + case stat@ValDef(_, _, _, _) if stat.symbol.isLazy => true + case _ => false + } + treeCopy.Block(tree, lzyVals:::rest, expr0) case _ => tree } |