Skip to content

Commit edf3ae0

Browse files
committed
Lift only *non-local* returns of try expressions.
1 parent 02e260a commit edf3ae0

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

src/compiler/scala/tools/nsc/transform/UnCurry.scala

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,8 @@ abstract class UnCurry extends InfoTransform
452452
}
453453
}
454454

455+
def isNonLocalReturn(ret: Return) = ret.symbol != currentOwner.enclMethod || currentOwner.isLazy
456+
455457
// ------ The tree transformers --------------------------------------------------------
456458

457459
def mainTransform(tree: Tree): Tree = {
@@ -551,8 +553,8 @@ abstract class UnCurry extends InfoTransform
551553
case Assign(lhs, _) if lhs.symbol.owner != currentMethod || lhs.symbol.hasFlag(LAZY | ACCESSOR) =>
552554
withNeedLift(true) { super.transform(tree) }
553555

554-
case Return(_) =>
555-
withNeedLift(true) { super.transform(tree) }
556+
case ret @ Return(_) if (isNonLocalReturn(ret)) =>
557+
withNeedLift(true) { super.transform(ret) }
556558

557559
case Try(block, catches, finalizer) =>
558560
if (needTryLift || shouldBeLiftedAnyway(tree)) transform(liftTree(tree))
@@ -659,9 +661,9 @@ abstract class UnCurry extends InfoTransform
659661
applyUnary()
660662
case Select(_, _) | TypeApply(_, _) =>
661663
applyUnary()
662-
case Return(expr) if (tree.symbol != currentOwner.enclMethod || currentOwner.isLazy) =>
663-
debuglog("non local return in "+tree.symbol+" from "+currentOwner.enclMethod)
664-
atPos(tree.pos)(nonLocalReturnThrow(expr, tree.symbol))
664+
case ret @ Return(expr) if (isNonLocalReturn(ret)) =>
665+
debuglog("non local return in "+ret.symbol+" from "+currentOwner.enclMethod)
666+
atPos(ret.pos)(nonLocalReturnThrow(expr, ret.symbol))
665667
case TypeTree() =>
666668
tree
667669
case _ =>

0 commit comments

Comments
 (0)