diff options
author | Paul Phillips <paulp@improving.org> | 2012-05-03 23:41:10 -0700 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2012-05-04 01:22:23 -0700 |
commit | aad6deae7204a7fc95b59ede61b188bb62f51188 (patch) | |
tree | 4c034353840a59ee001c8e330c23126a0c50fb13 /src | |
parent | f146d5826fc335ee1ca9c285d69086a7475cb71e (diff) | |
download | scala-aad6deae7204a7fc95b59ede61b188bb62f51188.tar.gz scala-aad6deae7204a7fc95b59ede61b188bb62f51188.tar.bz2 scala-aad6deae7204a7fc95b59ede61b188bb62f51188.zip |
Fix for broken non-local returns.
Don't change the owner of a return if the new owner is nested
inside the old owner. Closes SI-5612.
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/reflect/internal/Trees.scala | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/compiler/scala/reflect/internal/Trees.scala b/src/compiler/scala/reflect/internal/Trees.scala index 5f1a8f3fbe..c43528b8e9 100644 --- a/src/compiler/scala/reflect/internal/Trees.scala +++ b/src/compiler/scala/reflect/internal/Trees.scala @@ -315,11 +315,19 @@ trait Trees extends api.Trees { self: SymbolTable => class ChangeOwnerTraverser(val oldowner: Symbol, val newowner: Symbol) extends Traverser { def changeOwner(tree: Tree) = tree match { case Return(expr) => - if (tree.symbol == oldowner) - tree.symbol = newowner + if (tree.symbol == oldowner) { + // SI-5612 + if (newowner hasTransOwner oldowner) + log("NOT changing owner of %s because %s is nested in %s".format(tree, newowner, oldowner)) + else { + log("changing owner of %s: %s => %s".format(tree, oldowner, newowner)) + tree.symbol = newowner + } + } case _: DefTree | _: Function => - if (tree.symbol != NoSymbol && tree.symbol.owner == oldowner) + if (tree.symbol != NoSymbol && tree.symbol.owner == oldowner) { tree.symbol.owner = newowner + } case _ => } override def traverse(tree: Tree) { |