diff options
author | Paul Phillips <paulp@improving.org> | 2011-05-16 21:09:48 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2011-05-16 21:09:48 +0000 |
commit | 1e5194b41cdc5563237381b80a9f948abbf96e6e (patch) | |
tree | c79e1e712b8085e3d255e6185466b998fd471eaf | |
parent | 6d2b5e14f8b4cc25fca8067fd09106f1474966f4 (diff) | |
download | scala-1e5194b41cdc5563237381b80a9f948abbf96e6e.tar.gz scala-1e5194b41cdc5563237381b80a9f948abbf96e6e.tar.bz2 scala-1e5194b41cdc5563237381b80a9f948abbf96e6e.zip |
Phase and Error handling code, no review.
-rw-r--r-- | src/compiler/scala/reflect/common/FatalError.scala | 6 | ||||
-rw-r--r-- | src/compiler/scala/reflect/common/MissingRequirementError.scala | 18 | ||||
-rw-r--r-- | src/compiler/scala/reflect/common/Phase.scala | 53 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/Phases.scala | 44 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/package.scala | 11 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/package.scala | 7 |
6 files changed, 138 insertions, 1 deletions
diff --git a/src/compiler/scala/reflect/common/FatalError.scala b/src/compiler/scala/reflect/common/FatalError.scala new file mode 100644 index 0000000000..0d4cd6e338 --- /dev/null +++ b/src/compiler/scala/reflect/common/FatalError.scala @@ -0,0 +1,6 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2011 LAMP/EPFL + * @author Martin Odersky + */ +package scala.reflect.common +case class FatalError(msg: String) extends Throwable(msg) diff --git a/src/compiler/scala/reflect/common/MissingRequirementError.scala b/src/compiler/scala/reflect/common/MissingRequirementError.scala new file mode 100644 index 0000000000..a580cfc2dc --- /dev/null +++ b/src/compiler/scala/reflect/common/MissingRequirementError.scala @@ -0,0 +1,18 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2011 LAMP/EPFL + * @author Martin Odersky + */ + +package scala.reflect +package common + +class MissingRequirementError(val req: String) extends FatalError(req + " not found.") + +object MissingRequirementError { + def unapply(x: Throwable) = x match { + case x: MissingRequirementError => Some(x.req) + case _ => None + } +} + + diff --git a/src/compiler/scala/reflect/common/Phase.scala b/src/compiler/scala/reflect/common/Phase.scala new file mode 100644 index 0000000000..e351b3f676 --- /dev/null +++ b/src/compiler/scala/reflect/common/Phase.scala @@ -0,0 +1,53 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2011 LAMP/EPFL + * @author Martin Odersky + */ + +package scala.reflect +package common + +abstract class Phase(val prev: Phase) { + + type Id = Int + + val id: Id = if (prev eq null) 0 else prev.id + 1 + + /** New flags visible after this phase has completed */ + def nextFlags: Long = 0l + + /** New flags visible once this phase has started */ + def newFlags: Long = 0l + + private var fmask: Long = + if (prev eq null) Flags.InitialFlags else prev.flagMask | prev.nextFlags | newFlags + def flagMask: Long = fmask + + private var nx: Phase = this + if ((prev ne null) && (prev ne NoPhase)) prev.nx = this + + def next: Phase = nx + + def name: String + def description: String = name + // Will running with -Ycheck:name work? + def checkable: Boolean = true + // def devirtualized: Boolean = false + def specialized: Boolean = false + def erasedTypes: Boolean = false + def flatClasses: Boolean = false + def refChecked: Boolean = false + def keepsTypeParams = true + def run(): Unit + + override def toString() = name + override def hashCode = id.## + name.## + override def equals(other: Any) = other match { + case x: Phase => id == x.id && name == x.name + case _ => false + } +} + +object NoPhase extends Phase(null) { + def name = "<no phase>" + def run() { throw new Error("NoPhase.run") } +} diff --git a/src/compiler/scala/tools/nsc/Phases.scala b/src/compiler/scala/tools/nsc/Phases.scala new file mode 100644 index 0000000000..d18495458c --- /dev/null +++ b/src/compiler/scala/tools/nsc/Phases.scala @@ -0,0 +1,44 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2011 LAMP/EPFL + * @author Martin Odersky + */ + +package scala.tools.nsc + +import symtab.Flags +import util.TableDef + +object Phases { + val MaxPhases = 64 + + /** A class for tracking something about each phase. + */ + class Model[T: Manifest] { + case class Cell(ph: Phase, value: T) { + def name = ph.name + def id = ph.id + } + val values = new Array[Cell](MaxPhases + 1) + def results = values filterNot (_ == null) + def apply(ph: Phase): T = values(ph.id).value + def update(ph: Phase, value: T): Unit = values(ph.id) = Cell(ph, value) + } + /** A class for recording the elapsed time of each phase in the + * interests of generating a classy and informative table. + */ + class TimingModel extends Model[Long] { + var total: Long = 0 + def table() = { + total = results map (_.value) sum; + new Format.Table(results sortBy (-_.value)) + } + object Format extends TableDef[Cell] { + >> ("phase" -> (_.name)) >+ " " + << ("id" -> (_.id)) >+ " " + >> ("ms" -> (_.value)) >+ " " + << ("share" -> (_.value.toDouble * 100 / total formatted "%.2f")) + } + def formatted = "" + table() + } +} + diff --git a/src/compiler/scala/tools/nsc/package.scala b/src/compiler/scala/tools/nsc/package.scala index 9b9cfe7280..11d9f6723f 100644 --- a/src/compiler/scala/tools/nsc/package.scala +++ b/src/compiler/scala/tools/nsc/package.scala @@ -10,4 +10,13 @@ package object nsc { type InterpreterSettings = interpreter.ISettings @deprecated("Use a class in the scala.tools.nsc.interpreter package.", "2.9.0") val InterpreterResults = interpreter.Results -}
\ No newline at end of file + + type Phase = scala.reflect.common.Phase + val NoPhase = scala.reflect.common.NoPhase + + type FatalError = scala.reflect.common.FatalError + val FatalError = scala.reflect.common.FatalError + + type MissingRequirementError = scala.reflect.common.MissingRequirementError + val MissingRequirementError = scala.reflect.common.MissingRequirementError +} diff --git a/src/compiler/scala/tools/nsc/symtab/package.scala b/src/compiler/scala/tools/nsc/symtab/package.scala new file mode 100644 index 0000000000..30de9c75bf --- /dev/null +++ b/src/compiler/scala/tools/nsc/symtab/package.scala @@ -0,0 +1,7 @@ +package scala.tools.nsc + +package object symtab { + + val Flags = reflect.common.Flags + +} |