diff options
author | Paul Phillips <paulp@improving.org> | 2012-11-30 11:05:30 +0100 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2012-12-27 15:47:33 -0800 |
commit | eb491d2f1a857a25e381eb23275b78ccafd2981a (patch) | |
tree | 8f7c552cbde244d0f9a8626134a133853e1797fd | |
parent | 57c40c54d6119c42e256d6f7c4c7681a5257b266 (diff) | |
download | scala-eb491d2f1a857a25e381eb23275b78ccafd2981a.tar.gz scala-eb491d2f1a857a25e381eb23275b78ccafd2981a.tar.bz2 scala-eb491d2f1a857a25e381eb23275b78ccafd2981a.zip |
Eliminate allocations in Trees and Symbols.
-rw-r--r-- | src/reflect/scala/reflect/api/Trees.scala | 3 | ||||
-rw-r--r-- | src/reflect/scala/reflect/internal/Symbols.scala | 12 |
2 files changed, 13 insertions, 2 deletions
diff --git a/src/reflect/scala/reflect/api/Trees.scala b/src/reflect/scala/reflect/api/Trees.scala index 05458cb311..0b44d6a237 100644 --- a/src/reflect/scala/reflect/api/Trees.scala +++ b/src/reflect/scala/reflect/api/Trees.scala @@ -2921,7 +2921,8 @@ trait Trees { self: Universe => def transform(tree: Tree): Tree = itransform(this, tree) /** Transforms a list of trees. */ - def transformTrees(trees: List[Tree]): List[Tree] = trees mapConserve transform + def transformTrees(trees: List[Tree]): List[Tree] = + if (trees.isEmpty) Nil else trees mapConserve transform /** Transforms a `Template`. */ def transformTemplate(tree: Template): Template = diff --git a/src/reflect/scala/reflect/internal/Symbols.scala b/src/reflect/scala/reflect/internal/Symbols.scala index fd5c3909b8..3d43500ef1 100644 --- a/src/reflect/scala/reflect/internal/Symbols.scala +++ b/src/reflect/scala/reflect/internal/Symbols.scala @@ -2048,7 +2048,17 @@ trait Symbols extends api.Symbols { self: SymbolTable => /** Returns all symbols overriden by this symbol. */ final def allOverriddenSymbols: List[Symbol] = ( if ((this eq NoSymbol) || !owner.isClass) Nil - else owner.ancestors map overriddenSymbol filter (_ != NoSymbol) + else { + def loop(xs: List[Symbol]): List[Symbol] = xs match { + case Nil => Nil + case x :: xs => + overriddenSymbol(x) match { + case NoSymbol => loop(xs) + case sym => sym :: loop(xs) + } + } + loop(owner.ancestors) + } ) /** Equivalent to allOverriddenSymbols.nonEmpty, but more efficient. */ |