summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2012-08-17 18:58:14 +0200
committerGrzegorz Kossakowski <grzegorz.kossakowski@gmail.com>2012-08-20 08:11:10 +0100
commitd7b73d439249cdac7b4c6c0624b18da40abdd580 (patch)
tree34e42aaae50c08446ce01d3b1cf8073cf3756e1c
parent5f3e2ce75c1223efc2bbacdb3e546f7d2628880a (diff)
downloadscala-d7b73d439249cdac7b4c6c0624b18da40abdd580.tar.gz
scala-d7b73d439249cdac7b4c6c0624b18da40abdd580.tar.bz2
scala-d7b73d439249cdac7b4c6c0624b18da40abdd580.zip
Some more closure hositing/elimination
-rw-r--r--src/reflect/scala/reflect/internal/Symbols.scala1
-rw-r--r--src/reflect/scala/reflect/internal/Types.scala21
2 files changed, 15 insertions, 7 deletions
diff --git a/src/reflect/scala/reflect/internal/Symbols.scala b/src/reflect/scala/reflect/internal/Symbols.scala
index 7b6aeb4d72..5ae045b404 100644
--- a/src/reflect/scala/reflect/internal/Symbols.scala
+++ b/src/reflect/scala/reflect/internal/Symbols.scala
@@ -3219,6 +3219,7 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
private[scala] final val symbolIsNonVariant = (sym: Symbol) => sym.variance == 0
private[scala] final val typeConstructorOfSymbol = (sym: Symbol) => sym.typeConstructor
private[scala] final val tpeOfSymbol = (sym: Symbol) => sym.tpe
+ private[scala] final val infoOfSymbol = (sym: Symbol) => sym.info
private[scala] final val tpeHKOfSymbol = (sym: Symbol) => sym.tpeHK
@tailrec private[scala] final
diff --git a/src/reflect/scala/reflect/internal/Types.scala b/src/reflect/scala/reflect/internal/Types.scala
index b23588707c..6d718eed79 100644
--- a/src/reflect/scala/reflect/internal/Types.scala
+++ b/src/reflect/scala/reflect/internal/Types.scala
@@ -5174,19 +5174,26 @@ trait Types extends api.Types { self: SymbolTable =>
case NullaryMethodType(result) =>
typeDepth(result)
case PolyType(tparams, result) =>
- typeDepth(result) max typeDepth(tparams map (_.info)) + 1 // !!!OPT!!!
+ typeDepth(result) max typeDepth(tparams map infoOfSymbol) + 1
case ExistentialType(tparams, result) =>
- typeDepth(result) max typeDepth(tparams map (_.info)) + 1
+ typeDepth(result) max typeDepth(tparams map infoOfSymbol) + 1
case _ =>
1
}
private def maxDepth(tps: List[Type], by: Type => Int): Int = {
- var d = 0
- for (tp <- tps) d = d max by(tp) //!!!OPT!!!
- d
- }
-
+ //OPT replaced with tailrecursive function to save on #closures
+ // was:
+ // var d = 0
+ // for (tp <- tps) d = d max by(tp) //!!!OPT!!!
+ // d
+ def loop(tps: List[Type], acc: Int): Int = tps match {
+ case tp :: rest => loop(rest, acc max by(tp))
+ case _ => acc
+ }
+ loop(tps, 0)
+ }
+
private def typeDepth(tps: List[Type]): Int = maxDepth(tps, typeDepth)
private def baseTypeSeqDepth(tps: List[Type]): Int = maxDepth(tps, _.baseTypeSeqDepth)