diff options
author | Szabolcs Berecz <szabolcs.berecz@gmail.com> | 2012-02-29 21:49:16 +0100 |
---|---|---|
committer | Szabolcs Berecz <szabolcs.berecz@gmail.com> | 2012-02-29 21:49:59 +0100 |
commit | edf3ae0b8c3688b5cacbe2f7e2ae826f5fbb7644 (patch) | |
tree | 5f02f5b01d20cf2bd784f3e0e398ab10ecf369ec | |
parent | 02e260a8e67e2b2b6f876aafe76cd61248a89374 (diff) | |
download | scala-edf3ae0b8c3688b5cacbe2f7e2ae826f5fbb7644.tar.gz scala-edf3ae0b8c3688b5cacbe2f7e2ae826f5fbb7644.tar.bz2 scala-edf3ae0b8c3688b5cacbe2f7e2ae826f5fbb7644.zip |
Lift only *non-local* returns of try expressions.
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/UnCurry.scala | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/UnCurry.scala b/src/compiler/scala/tools/nsc/transform/UnCurry.scala index 0e6f96fb07..0d563c4d7d 100644 --- a/src/compiler/scala/tools/nsc/transform/UnCurry.scala +++ b/src/compiler/scala/tools/nsc/transform/UnCurry.scala @@ -452,6 +452,8 @@ abstract class UnCurry extends InfoTransform } } + def isNonLocalReturn(ret: Return) = ret.symbol != currentOwner.enclMethod || currentOwner.isLazy + // ------ The tree transformers -------------------------------------------------------- def mainTransform(tree: Tree): Tree = { @@ -551,8 +553,8 @@ abstract class UnCurry extends InfoTransform case Assign(lhs, _) if lhs.symbol.owner != currentMethod || lhs.symbol.hasFlag(LAZY | ACCESSOR) => withNeedLift(true) { super.transform(tree) } - case Return(_) => - withNeedLift(true) { super.transform(tree) } + case ret @ Return(_) if (isNonLocalReturn(ret)) => + withNeedLift(true) { super.transform(ret) } case Try(block, catches, finalizer) => if (needTryLift || shouldBeLiftedAnyway(tree)) transform(liftTree(tree)) @@ -659,9 +661,9 @@ abstract class UnCurry extends InfoTransform applyUnary() case Select(_, _) | TypeApply(_, _) => applyUnary() - case Return(expr) if (tree.symbol != currentOwner.enclMethod || currentOwner.isLazy) => - debuglog("non local return in "+tree.symbol+" from "+currentOwner.enclMethod) - atPos(tree.pos)(nonLocalReturnThrow(expr, tree.symbol)) + case ret @ Return(expr) if (isNonLocalReturn(ret)) => + debuglog("non local return in "+ret.symbol+" from "+currentOwner.enclMethod) + atPos(ret.pos)(nonLocalReturnThrow(expr, ret.symbol)) case TypeTree() => tree case _ => |