diff options
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/scala/reflect/internal/Symbols.scala | 4 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/Global.scala | 28 |
2 files changed, 30 insertions, 2 deletions
diff --git a/src/compiler/scala/reflect/internal/Symbols.scala b/src/compiler/scala/reflect/internal/Symbols.scala index 75fd733e7e..bc0c81a54b 100644 --- a/src/compiler/scala/reflect/internal/Symbols.scala +++ b/src/compiler/scala/reflect/internal/Symbols.scala @@ -1097,6 +1097,10 @@ trait Symbols extends api.Symbols { self: SymbolTable => def typeParams: List[Symbol] = if (isMonomorphicType) Nil else { + // analogously to the "info" getter, here we allow for two completions: + // one: sourceCompleter to LazyType, two: LazyType to completed type + if (validTo == NoPeriod) + atPhase(phaseOf(infos.validFrom))(rawInfo load this) if (validTo == NoPeriod) atPhase(phaseOf(infos.validFrom))(rawInfo load this) diff --git a/src/compiler/scala/tools/nsc/Global.scala b/src/compiler/scala/tools/nsc/Global.scala index b4f14dd21b..f14474eda8 100644 --- a/src/compiler/scala/tools/nsc/Global.scala +++ b/src/compiler/scala/tools/nsc/Global.scala @@ -343,7 +343,14 @@ class Global(var currentSettings: Settings, var reporter: Reporter) extends Symb def run() { echoPhaseSummary(this) - currentRun.units foreach applyPhase + currentRun.units foreach { unit => + if (opt.timings) { + val start = System.nanoTime + try applyPhase(unit) + finally unitTimings(unit) += (System.nanoTime - start) + } + else applyPhase(unit) + } } def apply(unit: CompilationUnit): Unit @@ -669,6 +676,21 @@ class Global(var currentSettings: Settings, var reporter: Reporter) extends Symb protected lazy val phasesSet = new mutable.HashSet[SubComponent] protected lazy val phasesDescMap = new mutable.HashMap[SubComponent, String] withDefaultValue "" private lazy val phaseTimings = new Phases.TimingModel // tracking phase stats + private lazy val unitTimings = mutable.HashMap[CompilationUnit, Long]() withDefaultValue 0L // tracking time spent per unit + private def unitTimingsFormatted(): String = { + def toMillis(nanos: Long) = "%.3f" format nanos / 1000000d + + val formatter = new util.TableDef[(String, String)] { + >> ("ms" -> (_._1)) >+ " " + << ("path" -> (_._2)) + } + "" + ( + new formatter.Table(unitTimings.toList sortBy (-_._2) map { + case (unit, nanos) => (toMillis(nanos), unit.source.path) + }) + ) + } + protected def addToPhasesSet(sub: SubComponent, descr: String) { phasesSet += sub phasesDescMap(sub) = descr @@ -1149,8 +1171,10 @@ class Global(var currentSettings: Settings, var reporter: Reporter) extends Symb if (opt.profileAll) profiler.stopProfiling() - if (opt.timings) + if (opt.timings) { inform(phaseTimings.formatted) + inform(unitTimingsFormatted) + } // In case no phase was specified for -Xshow-class/object, show it now for sure. if (opt.noShow) |