Skip to content

Commit 0d22181

Browse files
authored
Merge pull request #3365 from dotty-staging/cleanup-LabelDefs
Cleanup LabelDefs
2 parents 68cc7ee + e5dcf8e commit 0d22181

File tree

1 file changed

+27
-73
lines changed

1 file changed

+27
-73
lines changed
Lines changed: 27 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,12 @@
11
package dotty.tools.backend.jvm
22

3-
import dotty.tools.dotc.ast.Trees.Thicket
4-
import dotty.tools.dotc.ast.{Trees, tpd}
3+
import dotty.tools.dotc.ast.tpd
54
import dotty.tools.dotc.core.Contexts.Context
6-
import dotty.tools.dotc.core.Types
5+
import dotty.tools.dotc.core.Flags._
6+
import dotty.tools.dotc.core.Symbols._
77
import dotty.tools.dotc.transform.MegaPhase._
8-
import dotty.tools.dotc
9-
import dotty.tools.dotc.backend.jvm.DottyPrimitives
10-
import dotty.tools.dotc.core.Flags.FlagSet
11-
import dotty.tools.dotc.transform.Erasure
12-
import dotty.tools.dotc.transform.SymUtils._
13-
import java.io.{File => JFile}
148

15-
import scala.collection.generic.Clearable
169
import scala.collection.mutable
17-
import scala.collection.mutable.{ListBuffer, ArrayBuffer}
18-
import scala.reflect.ClassTag
19-
import dotty.tools.io.{Directory, PlainDirectory, AbstractFile}
20-
import scala.tools.asm.{ClassVisitor, FieldVisitor, MethodVisitor}
21-
import scala.tools.nsc.backend.jvm.{BCodeHelpers, BackendInterface}
22-
import dotty.tools.dotc.core._
23-
import Periods._
24-
import SymDenotations._
25-
import Contexts._
26-
import Types._
27-
import Symbols._
28-
import Denotations._
29-
import Phases._
30-
import java.lang.AssertionError
31-
import dotty.tools.dotc.util.Positions.Position
32-
import Decorators._
33-
import tpd._
34-
import Flags._
35-
import StdNames.nme
3610

3711
/**
3812
* Verifies that each Label DefDef has only a single address to jump back and
@@ -82,68 +56,48 @@ import StdNames.nme
8256
* @author Dmitry Petrashko
8357
*/
8458
class LabelDefs extends MiniPhase {
85-
def phaseName: String = "labelDef"
59+
import tpd._
8660

87-
val queue = new ArrayBuffer[Tree]()
88-
val beingAppended = new mutable.HashSet[Symbol]()
89-
var labelLevel = 0
61+
def phaseName: String = "labelDef"
9062

91-
override def transformDefDef(tree: tpd.DefDef)(implicit ctx: Context): tpd.Tree = {
92-
if (tree.symbol is Flags.Label) tree
63+
override def transformDefDef(tree: DefDef)(implicit ctx: Context): Tree = {
64+
if (tree.symbol is Label) tree
9365
else {
94-
collectLabelDefs.clear
95-
val newRhs = collectLabelDefs.transform(tree.rhs)
96-
var labelDefs = collectLabelDefs.labelDefs
66+
val labelDefs = collectLabelDefs(tree.rhs)
9767

9868
def putLabelDefsNearCallees = new TreeMap() {
99-
100-
override def transform(tree: tpd.Tree)(implicit ctx: Context): tpd.Tree = {
69+
override def transform(tree: Tree)(implicit ctx: Context): Tree = {
10170
tree match {
10271
case t: Apply if labelDefs.contains(t.symbol) =>
10372
val labelDef = labelDefs(t.symbol)
10473
labelDefs -= t.symbol
105-
106-
val labelDef2 = transform(labelDef)
74+
val labelDef2 = cpy.DefDef(labelDef)(rhs = transform(labelDef.rhs))
10775
Block(labelDef2:: Nil, t)
108-
76+
case t: DefDef =>
77+
assert(t.symbol is Label)
78+
EmptyTree
10979
case _ => if (labelDefs.nonEmpty) super.transform(tree) else tree
11080
}
11181
}
11282
}
11383

114-
val res = cpy.DefDef(tree)(rhs = putLabelDefsNearCallees.transform(newRhs))
115-
116-
res
84+
if (labelDefs.isEmpty) tree
85+
else cpy.DefDef(tree)(rhs = putLabelDefsNearCallees.transform(tree.rhs))
11786
}
11887
}
11988

120-
object collectLabelDefs extends TreeMap() {
121-
89+
private def collectLabelDefs(tree: Tree)(implicit ctx: Context): mutable.HashMap[Symbol, DefDef] = {
12290
// labelSymbol -> Defining tree
123-
val labelDefs = new mutable.HashMap[Symbol, Tree]()
124-
125-
def clear = {
126-
labelDefs.clear()
127-
}
128-
129-
override def transform(tree: tpd.Tree)(implicit ctx: Context): tpd.Tree = tree match {
130-
case t: Template => t
131-
case t: Block =>
132-
val r = super.transform(t)
133-
r match {
134-
case t: Block if t.stats.isEmpty => t.expr
135-
case _ => r
136-
}
137-
case t: DefDef =>
138-
assert(t.symbol is Flags.Label)
139-
val r = super.transform(tree)
140-
labelDefs(r.symbol) = r
141-
EmptyTree
142-
case t: Apply if t.symbol is Flags.Label =>
143-
val sym = t.symbol
144-
super.transform(tree)
145-
case _ =>
146-
super.transform(tree)
147-
}
91+
val labelDefs = new mutable.HashMap[Symbol, DefDef]()
92+
new TreeTraverser {
93+
override def traverse(tree: Tree)(implicit ctx: Context): Unit = tree match {
94+
case t: DefDef =>
95+
assert(t.symbol is Label)
96+
labelDefs(t.symbol) = t
97+
traverseChildren(t)
98+
case _ => traverseChildren(tree)
99+
}
100+
}.traverse(tree)
101+
labelDefs
148102
}
149103
}

0 commit comments

Comments
 (0)