summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2012-11-30 11:05:30 +0100
committerPaul Phillips <paulp@improving.org>2012-12-27 15:47:33 -0800
commiteb491d2f1a857a25e381eb23275b78ccafd2981a (patch)
tree8f7c552cbde244d0f9a8626134a133853e1797fd
parent57c40c54d6119c42e256d6f7c4c7681a5257b266 (diff)
downloadscala-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.scala3
-rw-r--r--src/reflect/scala/reflect/internal/Symbols.scala12
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. */