diff options
author | Martin Odersky <odersky@gmail.com> | 2012-08-17 18:58:14 +0200 |
---|---|---|
committer | Grzegorz Kossakowski <grzegorz.kossakowski@gmail.com> | 2012-08-20 08:11:10 +0100 |
commit | d7b73d439249cdac7b4c6c0624b18da40abdd580 (patch) | |
tree | 34e42aaae50c08446ce01d3b1cf8073cf3756e1c | |
parent | 5f3e2ce75c1223efc2bbacdb3e546f7d2628880a (diff) | |
download | scala-d7b73d439249cdac7b4c6c0624b18da40abdd580.tar.gz scala-d7b73d439249cdac7b4c6c0624b18da40abdd580.tar.bz2 scala-d7b73d439249cdac7b4c6c0624b18da40abdd580.zip |
Some more closure hositing/elimination
-rw-r--r-- | src/reflect/scala/reflect/internal/Symbols.scala | 1 | ||||
-rw-r--r-- | src/reflect/scala/reflect/internal/Types.scala | 21 |
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) |