Skip to content

Commit 8e37cf2

Browse files
committed
Optimize transformTrees
Avoid the closure creation. Downside: the function is no longer tail recursive. But this hopefully matters less, since lists of trees are rarely very long. If they do get longer to be dangerous for stack overflows we fall back to a more conservative implementation.
1 parent abe9e92 commit 8e37cf2

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

compiler/src/dotty/tools/dotc/transform/MegaPhase.scala

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,20 @@ class MegaPhase(val miniPhases: Array[MiniPhase]) extends Phase {
449449
}
450450

451451
def transformTrees(trees: List[Tree], start: Int)(using Context): List[Tree] =
452-
flatten(trees.mapConserve(transformTree(_, start)))
452+
def recur(trees: List[Tree], count: Int): List[Tree] =
453+
if count > 1000 then
454+
// use a slower implementation that avoids stack overflows
455+
flatten(trees.mapConserve(transformTree(_, start)))
456+
else trees match
457+
case tree :: rest =>
458+
val tree1 = transformTree(tree, start)
459+
val rest1 = recur(rest, count + 1)
460+
if (tree1 eq tree) && (rest1 eq rest) then trees
461+
else tree1 match
462+
case Thicket(elems1) => elems1 ::: rest1
463+
case _ => tree1 :: rest1
464+
case nil => nil
465+
recur(trees, 0)
453466

454467
def transformSpecificTrees[T <: Tree](trees: List[T], start: Int)(using Context): List[T] =
455468
transformTrees(trees, start).asInstanceOf[List[T]]

0 commit comments

Comments
 (0)