diff options
Diffstat (limited to 'src')
67 files changed, 252 insertions, 259 deletions
diff --git a/src/actors/scala/actors/Actor.scala b/src/actors/scala/actors/Actor.scala index aeda4a4670..6c8647daaa 100644 --- a/src/actors/scala/actors/Actor.scala +++ b/src/actors/scala/actors/Actor.scala @@ -10,7 +10,7 @@ package scala.actors -import scala.util.control.ControlException +import scala.util.control.ControlThrowable import java.util.{Timer, TimerTask} import java.util.concurrent.{ExecutionException, Callable} @@ -29,7 +29,7 @@ object Actor extends Combinators { // timer thread runs as daemon private[actors] val timer = new Timer(true) - private[actors] val suspendException = new SuspendActorException + private[actors] val suspendException = new SuspendActorControl /** * Returns the currently executing actor. Should be used instead @@ -623,7 +623,7 @@ trait Actor extends AbstractActor with ReplyReactor with ReplyableActor { } // guarded by lock of this - // never throws SuspendActorException + // never throws SuspendActorControl private[actors] override def scheduleActor(f: PartialFunction[Any, Any], msg: Any) = if (f eq null) { // do nothing (timeout is handled instead) @@ -800,12 +800,12 @@ trait Actor extends AbstractActor with ReplyReactor with ReplyableActor { resumeActor() else if (waitingFor ne Reactor.waitingForNone) { scheduleActor(waitingFor, null) - /* Here we should not throw a SuspendActorException, + /* Here we should not throw a SuspendActorControl, since the current method is called from an actor that is in the process of exiting. Therefore, the contract for scheduleActor is that - it never throws a SuspendActorException. + it never throws a SuspendActorControl. */ } } @@ -851,4 +851,4 @@ case class Exit(from: AbstractActor, reason: AnyRef) * @version 0.9.8 * @author Philipp Haller */ -private[actors] class SuspendActorException extends Throwable with ControlException +private[actors] class SuspendActorControl extends ControlThrowable diff --git a/src/actors/scala/actors/Combinators.scala b/src/actors/scala/actors/Combinators.scala index 073247827c..3c0be7ed15 100644 --- a/src/actors/scala/actors/Combinators.scala +++ b/src/actors/scala/actors/Combinators.scala @@ -34,6 +34,6 @@ private[actors] trait Combinators { if (cond) { body andThen loopWhile(cond)(body) } else continue - def continue: Unit = throw new KillActorException + def continue: Unit = throw new KillActorControl } diff --git a/src/actors/scala/actors/Reaction.scala b/src/actors/scala/actors/Reaction.scala index a8364bc8fb..7ff9204363 100644 --- a/src/actors/scala/actors/Reaction.scala +++ b/src/actors/scala/actors/Reaction.scala @@ -11,10 +11,10 @@ package scala.actors -import scala.util.control.ControlException +import scala.util.control.ControlThrowable import java.lang.{InterruptedException, Runnable} -private[actors] class KillActorException extends Throwable with ControlException +private[actors] class KillActorControl extends ControlThrowable /** <p> * The abstract class <code>Reaction</code> associates diff --git a/src/actors/scala/actors/Reactor.scala b/src/actors/scala/actors/Reactor.scala index a6007a6cd8..a71368e6b2 100644 --- a/src/actors/scala/actors/Reactor.scala +++ b/src/actors/scala/actors/Reactor.scala @@ -119,11 +119,11 @@ trait Reactor extends OutputChannel[Any] with Combinators { handler(item._1) else { scheduleActor(handler, item._1) - /* Here, we throw a SuspendActorException to avoid + /* Here, we throw a SuspendActorControl to avoid terminating this actor when the current ReactorTask is finished. - The SuspendActorException skips the termination code + The SuspendActorControl skips the termination code in ReactorTask. */ throw Actor.suspendException @@ -163,11 +163,11 @@ trait Reactor extends OutputChannel[Any] with Combinators { // keep going } else { waitingFor = handler - /* Here, we throw a SuspendActorException to avoid + /* Here, we throw a SuspendActorControl to avoid terminating this actor when the current ReactorTask is finished. - The SuspendActorException skips the termination code + The SuspendActorControl skips the termination code in ReactorTask. */ throw Actor.suspendException @@ -191,7 +191,7 @@ trait Reactor extends OutputChannel[Any] with Combinators { * * assume handler != null * - * never throws SuspendActorException + * never throws SuspendActorControl */ private[actors] def scheduleActor(handler: PartialFunction[Any, Any], msg: Any) = { val fun = () => handler(msg): Unit @@ -228,7 +228,7 @@ trait Reactor extends OutputChannel[Any] with Combinators { throw Actor.suspendException } first - throw new KillActorException + throw new KillActorControl } protected[this] def exit(): Nothing = { diff --git a/src/actors/scala/actors/ReactorTask.scala b/src/actors/scala/actors/ReactorTask.scala index 3e64eab7a2..87ec7834fa 100644 --- a/src/actors/scala/actors/ReactorTask.scala +++ b/src/actors/scala/actors/ReactorTask.scala @@ -35,12 +35,12 @@ private[actors] class ReactorTask[T >: Null <: Reactor](var reactor: T, var fun: reactor.exceptionHandler(e) } } catch { - case _: KillActorException => + case _: KillActorControl => } reactor.kill() } catch { - case _: SuspendActorException => + case _: SuspendActorControl => // do nothing (continuation is already saved) case e: Exception => diff --git a/src/actors/scala/actors/scheduler/ForkJoinScheduler.scala b/src/actors/scala/actors/scheduler/ForkJoinScheduler.scala index e2537511ac..ab4fca04ca 100644 --- a/src/actors/scala/actors/scheduler/ForkJoinScheduler.scala +++ b/src/actors/scala/actors/scheduler/ForkJoinScheduler.scala @@ -67,12 +67,12 @@ class ForkJoinScheduler(val initCoreSize: Int, val maxSize: Int, daemon: Boolean } if (terminating) - throw new QuitException + throw new QuitControl if (allActorsTerminated) { Debug.info(this+": all actors terminated") terminating = true - throw new QuitException + throw new QuitControl } if (!snapshoting) { @@ -83,12 +83,12 @@ class ForkJoinScheduler(val initCoreSize: Int, val maxSize: Int, daemon: Boolean Debug.info(this+": drained "+num+" tasks") drainedTasks = list terminating = true - throw new QuitException + throw new QuitControl } } } } catch { - case _: QuitException => + case _: QuitControl => Debug.info(this+": initiating shutdown...") while (!pool.isQuiescent()) { try { diff --git a/src/actors/scala/actors/scheduler/ResizableThreadPoolScheduler.scala b/src/actors/scala/actors/scheduler/ResizableThreadPoolScheduler.scala index ff74d0bc8b..3687138e0e 100644 --- a/src/actors/scala/actors/scheduler/ResizableThreadPoolScheduler.scala +++ b/src/actors/scala/actors/scheduler/ResizableThreadPoolScheduler.scala @@ -112,7 +112,7 @@ class ResizableThreadPoolScheduler(protected val terminate: Boolean, } if (terminating) - throw new QuitException + throw new QuitControl if (!suspending) { gc() @@ -129,19 +129,19 @@ class ResizableThreadPoolScheduler(protected val terminate: Boolean, Debug.info(this+": corePoolSize = "+coreSize+", maxPoolSize = "+maxSize) terminating = true - throw new QuitException + throw new QuitControl } } } else { drainedTasks = executor.shutdownNow() Debug.info(this+": drained "+drainedTasks.size()+" tasks") terminating = true - throw new QuitException + throw new QuitControl } } // sync } } catch { - case _: QuitException => + case _: QuitControl => executor.shutdown() // allow thread to exit } diff --git a/src/actors/scala/actors/scheduler/SchedulerService.scala b/src/actors/scala/actors/scheduler/SchedulerService.scala index dca8bb5b9c..1f886dbae9 100644 --- a/src/actors/scala/actors/scheduler/SchedulerService.scala +++ b/src/actors/scala/actors/scheduler/SchedulerService.scala @@ -11,7 +11,7 @@ package scala.actors package scheduler -import scala.util.control.ControlException +import scala.util.control.ControlThrowable import java.lang.{Runnable, Thread, InterruptedException} /** @@ -46,16 +46,16 @@ abstract class SchedulerService(daemon: Boolean) extends Thread with IScheduler case _: InterruptedException => } if (terminating) - throw new QuitException + throw new QuitControl gc() if (allActorsTerminated) - throw new QuitException + throw new QuitControl } } } catch { - case _: QuitException => + case _: QuitControl => Debug.info(this+": initiating shutdown...") // invoke shutdown hook onShutdown() @@ -71,10 +71,10 @@ abstract class SchedulerService(daemon: Boolean) extends Thread with IScheduler } /** - * The <code>QuitException</code> class is used to manage control flow + * The <code>QuitControl</code> class is used to manage control flow * of certain schedulers and worker threads. * * @version 0.9.8 * @author Philipp Haller */ -private[actors] class QuitException extends Throwable with ControlException +private[actors] class QuitControl extends ControlThrowable diff --git a/src/actors/scala/actors/scheduler/TerminationService.scala b/src/actors/scala/actors/scheduler/TerminationService.scala index b6f03f11e5..da71b6ac2b 100644 --- a/src/actors/scala/actors/scheduler/TerminationService.scala +++ b/src/actors/scala/actors/scheduler/TerminationService.scala @@ -40,14 +40,14 @@ abstract class TerminationService(terminate: Boolean) case _: InterruptedException => } if (terminating) - throw new QuitException + throw new QuitControl if (terminate && allActorsTerminated) - throw new QuitException + throw new QuitControl } } } catch { - case _: QuitException => + case _: QuitControl => Debug.info(this+": initiating shutdown...") // invoke shutdown hook onShutdown() diff --git a/src/actors/scala/actors/scheduler/ThreadPoolScheduler.scala b/src/actors/scala/actors/scheduler/ThreadPoolScheduler.scala index 2eb18645ff..2061207ee1 100644 --- a/src/actors/scala/actors/scheduler/ThreadPoolScheduler.scala +++ b/src/actors/scala/actors/scheduler/ThreadPoolScheduler.scala @@ -58,13 +58,13 @@ class ThreadPoolScheduler(protected var executor: ThreadPoolExecutor, } if (terminating || (terminate && allActorsTerminated)) - throw new QuitException + throw new QuitControl gc() } } } catch { - case _: QuitException => + case _: QuitControl => Debug.info(this+": initiating shutdown...") // invoke shutdown hook onShutdown() diff --git a/src/compiler/scala/tools/nsc/FatalError.scala b/src/compiler/scala/tools/nsc/FatalError.scala index 7bc1bc52d8..aee083fa14 100644 --- a/src/compiler/scala/tools/nsc/FatalError.scala +++ b/src/compiler/scala/tools/nsc/FatalError.scala @@ -6,7 +6,9 @@ package scala.tools.nsc -case class FatalError(msg: String) extends Exception(msg) +import scala.util.control.ControlThrowable + +case class FatalError(msg: String) extends Throwable(msg) with ControlThrowable class MissingRequirementError(val req: String) extends FatalError(req + " not found.") diff --git a/src/compiler/scala/tools/nsc/Global.scala b/src/compiler/scala/tools/nsc/Global.scala index 92c72b1549..bf75c8d121 100644 --- a/src/compiler/scala/tools/nsc/Global.scala +++ b/src/compiler/scala/tools/nsc/Global.scala @@ -154,29 +154,26 @@ class Global(var settings: Settings, var reporter: Reporter) extends SymbolTable if (settings.log contains phase.name) inform("[log " + phase + "] " + msg) } - class ErrorWithPosition(val pos: Int, val error: Throwable) extends Error - - def tryWith[T](pos: Int, body: => T): T = try { - body - } catch { - case e : ErrorWithPosition => throw e - case te: TypeError => throw te - case e : Error => throw new ErrorWithPosition(pos, e) - case e : RuntimeException => throw new ErrorWithPosition(pos, e) - } + class ThrowableWithPosition(val pos: Int, val error: Throwable) extends Throwable + + def tryWith[T](pos: Int, body: => T): T = + try body + catch { + case e : ThrowableWithPosition => throw e + case te: TypeError => throw te + case e : RuntimeException => throw new ThrowableWithPosition(pos, e) + } - def catchWith[T](source : SourceFile, body : => T) : T = try { - body - } catch { - case e : ErrorWithPosition => - logError("POS: " + source.dbg(e.pos), e) - throw e.error - } + def catchWith[T](source : SourceFile, body : => T) : T = + try body + catch { + case e : ThrowableWithPosition => + logError("POS: " + source.dbg(e.pos), e) + throw e.error + } def logError(msg: String, t: Throwable): Unit = () - def abort(msg: String) = throw new Error(msg) - // ------------ File interface ----------------------------------------- private val reader: SourceReader = { diff --git a/src/compiler/scala/tools/nsc/ScriptRunner.scala b/src/compiler/scala/tools/nsc/ScriptRunner.scala index 7be39aa27c..51e85eaf95 100644 --- a/src/compiler/scala/tools/nsc/ScriptRunner.scala +++ b/src/compiler/scala/tools/nsc/ScriptRunner.scala @@ -112,7 +112,7 @@ object ScriptRunner jar.close } catch { - case _: Error => jarFile.delete() // XXX what errors to catch? + case _: Exception => jarFile.delete() } } diff --git a/src/compiler/scala/tools/nsc/ast/TreeBrowsers.scala b/src/compiler/scala/tools/nsc/ast/TreeBrowsers.scala index 42428c7d8f..eaad12c0ed 100644 --- a/src/compiler/scala/tools/nsc/ast/TreeBrowsers.scala +++ b/src/compiler/scala/tools/nsc/ast/TreeBrowsers.scala @@ -680,7 +680,7 @@ abstract class TreeBrowsers { toDocument(thistpe) :/: ", " :/: toDocument(supertpe) ::")")) case _ => - throw new Error("Unknown case: " + t.toString() +", "+ t.getClass) + Predef.error("Unknown case: " + t.toString() +", "+ t.getClass) } } diff --git a/src/compiler/scala/tools/nsc/ast/TreeGen.scala b/src/compiler/scala/tools/nsc/ast/TreeGen.scala index 104e00a03d..ccb60bc886 100644 --- a/src/compiler/scala/tools/nsc/ast/TreeGen.scala +++ b/src/compiler/scala/tools/nsc/ast/TreeGen.scala @@ -98,7 +98,7 @@ abstract class TreeGen mkAttributedQualifier(firstStable.get) case _ => - throw new Error("bad qualifier: " + tpe) + abort("bad qualifier: " + tpe) } /** Builds a reference to given symbol with given stable prefix. */ diff --git a/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala b/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala index 53fc6542b2..e918489446 100644 --- a/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala +++ b/src/compiler/scala/tools/nsc/ast/parser/MarkupParsers.scala @@ -9,7 +9,7 @@ package ast.parser import scala.collection.mutable import mutable.{ Buffer, ArrayBuffer, ListBuffer, HashMap } -import scala.util.control.ControlException +import scala.util.control.ControlThrowable import scala.tools.nsc.util.{SourceFile,CharArrayReader} import scala.xml.{ Text, TextBuffer } import scala.xml.Utility.{ isNameStart, isNameChar, isSpace } @@ -35,15 +35,15 @@ trait MarkupParsers { self: Parsers => - case object MissingEndTagException extends RuntimeException with ControlException { + case object MissingEndTagControl extends ControlThrowable { override def getMessage = "start tag was here: " } - case object ConfusedAboutBracesException extends RuntimeException with ControlException { + case object ConfusedAboutBracesControl extends ControlThrowable { override def getMessage = " I encountered a '}' where I didn't expect one, maybe this tag isn't closed <" } - case object TruncatedXML extends RuntimeException with ControlException { + case object TruncatedXMLControl extends ControlThrowable { override def getMessage = "input ended while parsing XML" } @@ -63,9 +63,9 @@ trait MarkupParsers val eof = false - def truncatedError(msg: String): Nothing = throw TruncatedXML + def truncatedError(msg: String): Nothing = throw TruncatedXMLControl def xHandleError(that: Char, msg: String) = - if (ch == SU) throw TruncatedXML + if (ch == SU) throw TruncatedXMLControl else reportSyntaxError(msg) var input : CharArrayReader = _ @@ -92,11 +92,11 @@ trait MarkupParsers private def errorBraces() = { reportSyntaxError("in XML content, please use '}}' to express '}'") - throw ConfusedAboutBracesException + throw ConfusedAboutBracesControl } def errorNoEnd(tag: String) = { reportSyntaxError("expected closing tag of " + tag) - throw MissingEndTagException + throw MissingEndTagControl } /** checks whether next character starts a Scala block, if yes, skip it. @@ -137,7 +137,7 @@ trait MarkupParsers nextch xEmbeddedExpr case SU => - throw TruncatedXML + throw TruncatedXMLControl case _ => errorAndResult("' or \" delimited attribute value or '{' scala-expr '}' expected", Literal(Constant("<syntax-error>"))) } @@ -307,23 +307,21 @@ trait MarkupParsers } /** Some try/catch/finally logic used by xLiteral and xLiteralPattern. */ - private def xLiteralCommon(f: () => Tree, ifTruncated: Exception => Unit): Tree = - try f() + private def xLiteralCommon(f: () => Tree, ifTruncated: String => Unit): Tree = { + try return f() catch { - case ex: RuntimeException => - ex match { - case c @ TruncatedXML => - ifTruncated(c) - case c @ (MissingEndTagException | ConfusedAboutBracesException) => - parser.syntaxError(debugLastPos, c.getMessage + debugLastElem + ">") - case _: ArrayIndexOutOfBoundsException => - parser.syntaxError(debugLastPos, "missing end tag in XML literal for <%s>" format debugLastElem) - case _ => throw ex - } - EmptyTree + case c @ TruncatedXMLControl => + ifTruncated(c.getMessage) + case c @ (MissingEndTagControl | ConfusedAboutBracesControl) => + parser.syntaxError(debugLastPos, c.getMessage + debugLastElem + ">") + case _: ArrayIndexOutOfBoundsException => + parser.syntaxError(debugLastPos, "missing end tag in XML literal for <%s>" format debugLastElem) } finally parser.in resume Tokens.XMLSTART + EmptyTree + } + /** Use a lookahead parser to run speculative body, and return the first char afterward. */ private def charComingAfter(body: => Unit): Char = { input = input.lookaheadReader @@ -361,7 +359,7 @@ trait MarkupParsers ts(0) } }, - ex => parser.incompleteInputError(ex.getMessage) + msg => parser.incompleteInputError(msg) ) /** @see xmlPattern. resynchronizes after successful parse @@ -377,7 +375,7 @@ trait MarkupParsers tree } }, - ex => parser.syntaxError(curOffset, ex.getMessage) + msg => parser.syntaxError(curOffset, msg) ) def escapeToScala[A](op: => A, kind: String) = { @@ -436,7 +434,7 @@ trait MarkupParsers assert(!xEmbeddedBlock, "problem with embedded block") case SU => - throw TruncatedXML + throw TruncatedXMLControl case _ => // text appendText(r2p(start1, start1, curOffset), ts, xText) diff --git a/src/compiler/scala/tools/nsc/backend/icode/CheckerError.scala b/src/compiler/scala/tools/nsc/backend/icode/CheckerError.scala index 1e6b8abafc..9d102eef28 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/CheckerError.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/CheckerError.scala @@ -9,5 +9,5 @@ package scala.tools.nsc package backend package icode -class CheckerError(s: String) extends Exception(s) +class CheckerException(s: String) extends Exception(s) diff --git a/src/compiler/scala/tools/nsc/backend/icode/Checkers.scala b/src/compiler/scala/tools/nsc/backend/icode/Checkers.scala index cbbd92a69b..63ccb12495 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/Checkers.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/Checkers.scala @@ -151,7 +151,7 @@ abstract class Checkers { else if (s2 eq emptyStack) s1 else { if (s1.length != s2.length) - throw new CheckerError("Incompatible stacks: " + s1 + " and " + s2 + " in " + method + " at entry to block: " + bl); + throw new CheckerException("Incompatible stacks: " + s1 + " and " + s2 + " in " + method + " at entry to block: " + bl); new TypeStack((s1.types, s2.types).zipped map lub) } } diff --git a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala index 35a5f80d1f..e13c72a8a5 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala @@ -836,8 +836,7 @@ abstract class GenICode extends SubComponent { generatedType = l.kind } catch { case ex: MatchError => - throw new Error("symbol " + tree.symbol + - " does not exist in " + ctx.method) + abort("symbol " + tree.symbol + " does not exist in " + ctx.method) } } } diff --git a/src/compiler/scala/tools/nsc/backend/icode/TypeKinds.scala b/src/compiler/scala/tools/nsc/backend/icode/TypeKinds.scala index d83659f477..4b53a5e2ae 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/TypeKinds.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/TypeKinds.scala @@ -138,7 +138,7 @@ trait TypeKinds { self: ICodes => (b.isReferenceType || b.isArrayType)) toTypeKind(lub0(a.toType, b.toType)) else - throw new CheckerError("Incompatible types: " + a + " with " + b) + throw new CheckerException("Incompatible types: " + a + " with " + b) } } diff --git a/src/compiler/scala/tools/nsc/backend/icode/analysis/CompleteLattice.scala b/src/compiler/scala/tools/nsc/backend/icode/analysis/CompleteLattice.scala index c26030cdb6..95f4418759 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/analysis/CompleteLattice.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/analysis/CompleteLattice.scala @@ -40,7 +40,7 @@ trait CompleteLattice { def lub(xs: List[Elem], exceptional: Boolean): Elem = try { if (xs == Nil) bottom else xs reduceLeft lub2(exceptional) } catch { - case e: LubError => + case e: LubException => Console.println("Lub on blocks: " + xs) throw e } diff --git a/src/compiler/scala/tools/nsc/backend/icode/analysis/CopyPropagation.scala b/src/compiler/scala/tools/nsc/backend/icode/analysis/CopyPropagation.scala index d71fa8420d..1fbbc10c3d 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/analysis/CopyPropagation.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/analysis/CopyPropagation.scala @@ -184,14 +184,14 @@ abstract class CopyPropagation { if (exceptional) exceptionHandlerStack else { // if (a.stack.length != b.stack.length) -// throw new LubError(a, b, "Invalid stacks in states: "); +// throw new LubException(a, b, "Invalid stacks in states: "); (a.stack, b.stack).zipped map { (v1, v2) => if (v1 == v2) v1 else Unknown } } /* if (a.stack.length != b.stack.length) - throw new LubError(a, b, "Invalid stacks in states: "); + throw new LubException(a, b, "Invalid stacks in states: "); val resStack = List.map2(a.stack, b.stack) { (v1, v2) => if (v1 == v2) v1 else Unknown } diff --git a/src/compiler/scala/tools/nsc/backend/icode/analysis/LubError.scala b/src/compiler/scala/tools/nsc/backend/icode/analysis/LubException.scala index ae0991f60a..0474d12a8b 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/analysis/LubError.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/analysis/LubException.scala @@ -8,6 +8,6 @@ package scala.tools.nsc package backend.icode.analysis -class LubError(a: Any, b: Any, msg: String) extends Exception { +class LubException(a: Any, b: Any, msg: String) extends Exception { override def toString() = "Lub error: " + msg + a + b } diff --git a/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala b/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala index 132e85f6d3..858512c9b1 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala @@ -52,7 +52,7 @@ abstract class TypeFlowAnalysis { else if ((s1 eq exceptionHandlerStack) || (s2 eq exceptionHandlerStack)) Predef.error("merging with exhan stack") else { // if (s1.length != s2.length) -// throw new CheckerError("Incompatible stacks: " + s1 + " and " + s2); +// throw new CheckerException("Incompatible stacks: " + s1 + " and " + s2); new TypeStack((s1.types, s2.types).zipped map icodes.lub) } } diff --git a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala index 16f87bd024..0b5028980e 100644 --- a/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala +++ b/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala @@ -1015,7 +1015,7 @@ abstract class GenJVM extends SubComponent { varsInBlock.clear for (instr <- b) { - class CompilationError(msg: String) extends Error { + class CompilationException(msg: String) extends Exception(msg) { override def toString: String = { msg + "\nCurrent method: " + method + @@ -1025,7 +1025,7 @@ abstract class GenJVM extends SubComponent { method.dump } } - def assert(cond: Boolean, msg: String) = if (!cond) throw new CompilationError(msg); + def assert(cond: Boolean, msg: String) = if (!cond) throw new CompilationException(msg) instr match { case THIS(clasz) => @@ -1840,7 +1840,7 @@ abstract class GenJVM extends SubComponent { def assert(cond: Boolean, msg: => String) = if (!cond) { method.dump - throw new Error(msg + "\nMethod: " + method) + abort(msg + "\nMethod: " + method) } def assert(cond: Boolean) { assert(cond, "Assertion failed.") } diff --git a/src/compiler/scala/tools/nsc/backend/msil/GenMSIL.scala b/src/compiler/scala/tools/nsc/backend/msil/GenMSIL.scala index 4177cddd3f..c7b1fc1dd8 100644 --- a/src/compiler/scala/tools/nsc/backend/msil/GenMSIL.scala +++ b/src/compiler/scala/tools/nsc/backend/msil/GenMSIL.scala @@ -1690,7 +1690,7 @@ abstract class GenMSIL extends SubComponent { val name = typeString(sym) val typ = clrTypes.getType(name) if (typ == null) - throw new Error(showsym(sym) + " with name " + name) + abort(showsym(sym) + " with name " + name) else { clrTypes.types(sym) = typ typ @@ -2046,7 +2046,7 @@ abstract class GenMSIL extends SubComponent { if (constr eq null) { System.out.println("Cannot find constructor " + sym.owner + "::" + sym.name) System.out.println("scope = " + sym.owner.tpe.decls) - throw new Error(sym.fullName) + abort(sym.fullName) } else { mapConstructor(sym, constr) @@ -2080,7 +2080,7 @@ abstract class GenMSIL extends SubComponent { if (method eq null) { System.out.println("Cannot find method " + sym.owner + "::" + msilName(sym)) System.out.println("scope = " + sym.owner.tpe.decls) - throw new Error(sym.fullName) + abort(sym.fullName) } else { mapMethod(sym, method) diff --git a/src/compiler/scala/tools/nsc/backend/opt/ClosureElimination.scala b/src/compiler/scala/tools/nsc/backend/opt/ClosureElimination.scala index b05061b0f6..1812753ccd 100644 --- a/src/compiler/scala/tools/nsc/backend/opt/ClosureElimination.scala +++ b/src/compiler/scala/tools/nsc/backend/opt/ClosureElimination.scala @@ -9,7 +9,7 @@ package scala.tools.nsc package backend.opt; import scala.collection.mutable.{Map, HashMap}; -import scala.tools.nsc.backend.icode.analysis.LubError; +import scala.tools.nsc.backend.icode.analysis.LubException; import scala.tools.nsc.symtab._; /** @@ -181,7 +181,7 @@ abstract class ClosureElimination extends SubComponent { } } }} catch { - case e: LubError => + case e: LubException => Console.println("In method: " + m) Console.println(e) e.printStackTrace diff --git a/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala b/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala index ba51c13d7c..b9d4b8d5a4 100644 --- a/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala +++ b/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala @@ -10,7 +10,6 @@ package backend.opt import scala.collection._ import scala.collection.immutable.{Map, HashMap, Set, HashSet} -import scala.tools.nsc.backend.icode.analysis.LubError import scala.tools.nsc.symtab._ /** diff --git a/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala b/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala index 5fdfe85c7e..8a646d2288 100644 --- a/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala +++ b/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala @@ -21,7 +21,7 @@ class ModelFactory(val global: Global, val settings: doc.Settings) { extractor = /** */ def makeModel: Package = - makePackage(RootPackage, null) getOrElse { throw new Error("no documentable class found in compilation units") } + makePackage(RootPackage, null) getOrElse abort("no documentable class found in compilation units") object commentator { @@ -278,7 +278,7 @@ class ModelFactory(val global: Global, val settings: doc.Settings) { extractor = val bSym = normalizeTemplate(aSym) if (bSym.isPackage) inTpl match { case inPkg: PackageImpl => makePackage(bSym, inPkg) getOrElse (new NoDocTemplateImpl(bSym, inPkg)) - case _ => throw new Error("'" + bSym + "' must be in a package") + case _ => abort("'" + bSym + "' must be in a package") } else if ((bSym.sourceFile != null) && bSym.isPublic && !bSym.isLocal) inTpl match { case inDTpl: DocTemplateImpl => makeDocTemplate(bSym, inDTpl) @@ -317,7 +317,7 @@ class ModelFactory(val global: Global, val settings: doc.Settings) { extractor = def isCaseClass = sym.isClass && sym.hasFlag(Flags.CASE) } else - throw new Error("'" + bSym + "' that isn't a class, trait or object cannot be built as a documentable template") + abort("'" + bSym + "' that isn't a class, trait or object cannot be built as a documentable template") } /** */ diff --git a/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala b/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala index ab02ae7460..5c16bb4465 100644 --- a/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala +++ b/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala @@ -2,7 +2,7 @@ package scala.tools.nsc package interactive import scala.concurrent.SyncVar -import scala.util.control.ControlException +import scala.util.control.ControlThrowable import scala.tools.nsc.io.AbstractFile import scala.tools.nsc.util.{SourceFile, Position, WorkScheduler} import scala.tools.nsc.symtab._ @@ -124,23 +124,19 @@ trait CompilerControl { self: Global => } /** Cancel currently pending high-priority jobs */ - def askCancel() = - scheduler.raise(new CancelActionReq) + def askCancel() = scheduler raise CancelActionReq /** Cancel current compiler run and start a fresh one where everything will be re-typechecked * (but not re-loaded). */ - def askReset() = - scheduler.raise(new FreshRunReq) + def askReset() = scheduler raise FreshRunReq /** Tell the compile server to shutdown, and do not restart again */ - def askShutdown() = - scheduler.raise(new ShutdownReq) + def askShutdown() = scheduler raise ShutdownReq // ---------------- Interpreted exeptions ------------------- - class CancelActionReq extends Exception with ControlException - class FreshRunReq extends Exception with ControlException - class ShutdownReq extends Exception with ControlException - + object CancelActionReq extends ControlThrowable + object FreshRunReq extends ControlThrowable + object ShutdownReq extends ControlThrowable } diff --git a/src/compiler/scala/tools/nsc/interactive/Global.scala b/src/compiler/scala/tools/nsc/interactive/Global.scala index 1f2a606e6b..c4fec12667 100644 --- a/src/compiler/scala/tools/nsc/interactive/Global.scala +++ b/src/compiler/scala/tools/nsc/interactive/Global.scala @@ -5,7 +5,7 @@ import java.io.{ PrintWriter, StringWriter } import scala.collection.mutable.{LinkedHashMap, SynchronizedMap} import scala.concurrent.SyncVar -import scala.util.control.ControlException +import scala.util.control.ControlThrowable import scala.tools.nsc.io.AbstractFile import scala.tools.nsc.util.{SourceFile, Position, RangePosition, OffsetPosition, NoPosition, WorkScheduler} import scala.tools.nsc.reporters._ @@ -91,10 +91,10 @@ self => // it will still be null now? if (context.unit != null) integrateNew() - throw new FreshRunReq - } catch { - case ex : ValidateError => // Ignore, this will have been reported elsewhere - case t : Throwable => throw t + throw FreshRunReq + } + catch { + case ex : ValidateException => // Ignore, this will have been reported elsewhere } } } @@ -114,9 +114,9 @@ self => * Poll for work reload/typedTreeAt/doFirst commands during background checking. */ def pollForWork() { - scheduler.pollException() match { - case Some(ex: CancelActionReq) => if (acting) throw ex - case Some(ex: FreshRunReq) => + scheduler.pollThrowable() match { + case Some(ex @ CancelActionReq) => if (acting) throw ex + case Some(ex @ FreshRunReq) => currentTyperRun = newTyperRun minRunId = currentRunId if (outOfDate) throw ex @@ -132,7 +132,7 @@ self => action() if (debugIDE) println("done with work item: "+action) } catch { - case ex: CancelActionReq => + case CancelActionReq => if (debugIDE) println("cancelled work item: "+action) } finally { if (debugIDE) println("quitting work item: "+action) @@ -195,19 +195,19 @@ self => backgroundCompile() outOfDate = false } catch { - case ex: FreshRunReq => + case FreshRunReq => } } } } catch { - case ex: ShutdownReq => + case ShutdownReq => ; case ex => outOfDate = false compileRunner = newRunnerThread ex match { - case _ : FreshRunReq => // This shouldn't be reported - case _ : ValidateError => // This will have been reported elsewhere + case FreshRunReq => // This shouldn't be reported + case _ : ValidateException => // This will have been reported elsewhere case _ => ex.printStackTrace(); inform("Fatal Error: "+ex) } } @@ -276,7 +276,7 @@ self => result set Left(op) return } catch { - case ex : FreshRunReq => + case ex @ FreshRunReq => scheduler.postWorkItem(() => respond(result)(op)) throw ex case ex => @@ -298,7 +298,7 @@ self => /** Make sure a set of compilation units is loaded and parsed */ def reload(sources: List[SourceFile], result: Response[Unit]) { respond(result)(reloadSources(sources)) - if (outOfDate) throw new FreshRunReq + if (outOfDate) throw FreshRunReq else outOfDate = true } @@ -534,7 +534,7 @@ self => def newTyperRun = new TyperRun - class TyperResult(val tree: Tree) extends Exception with ControlException + class TyperResult(val tree: Tree) extends ControlThrowable assert(globalPhase.id == 0) } diff --git a/src/compiler/scala/tools/nsc/interactive/RangePositions.scala b/src/compiler/scala/tools/nsc/interactive/RangePositions.scala index 49fc8be185..0186103aa1 100644 --- a/src/compiler/scala/tools/nsc/interactive/RangePositions.scala +++ b/src/compiler/scala/tools/nsc/interactive/RangePositions.scala @@ -199,7 +199,7 @@ self: scala.tools.nsc.Global => inform(tree.toString) inform("") inform("=======") - throw new ValidateError(msg) + throw new ValidateException(msg) } def validate(tree: Tree, encltree: Tree): Unit = { @@ -238,7 +238,7 @@ self: scala.tools.nsc.Global => validate(tree, tree) } - class ValidateError(msg : String) extends Exception(msg) + class ValidateException(msg : String) extends Exception(msg) // ---------------- Locating trees ---------------------------------- diff --git a/src/compiler/scala/tools/nsc/io/AbstractFile.scala b/src/compiler/scala/tools/nsc/io/AbstractFile.scala index 1f9e6c55f0..04aa661bd6 100644 --- a/src/compiler/scala/tools/nsc/io/AbstractFile.scala +++ b/src/compiler/scala/tools/nsc/io/AbstractFile.scala @@ -244,6 +244,9 @@ abstract class AbstractFile extends AnyRef with Iterable[AbstractFile] { Option(lookupName(name, true)) getOrElse new PlainFile((sfile.get / name).createDirectory()) } + protected def unsupported(): Nothing = unsupported(null) + protected def unsupported(msg: String): Nothing = throw new UnsupportedOperationException(msg) + /** Returns the path of this abstract file. */ override def toString() = path diff --git a/src/compiler/scala/tools/nsc/io/VirtualDirectory.scala b/src/compiler/scala/tools/nsc/io/VirtualDirectory.scala index 5675b264ac..f7e6832109 100644 --- a/src/compiler/scala/tools/nsc/io/VirtualDirectory.scala +++ b/src/compiler/scala/tools/nsc/io/VirtualDirectory.scala @@ -31,20 +31,15 @@ extends AbstractFile { override def output = error("directories cannot be written") /** Does this abstract file denote an existing file? */ - def create { - throw new UnsupportedOperationException - } + def create { unsupported } /** Delete the underlying file or directory (recursively). */ - def delete { - throw new UnsupportedOperationException - } + def delete { unsupported } /** Returns an abstract file with the given name. It does not * check that it exists. */ - def lookupNameUnchecked(name: String, directory: Boolean): AbstractFile = - throw new UnsupportedOperationException() + def lookupNameUnchecked(name: String, directory: Boolean): AbstractFile = unsupported private val files = mutable.Map.empty[String, AbstractFile] diff --git a/src/compiler/scala/tools/nsc/io/VirtualFile.scala b/src/compiler/scala/tools/nsc/io/VirtualFile.scala index 256d02c5a5..6e3ad7ead6 100644 --- a/src/compiler/scala/tools/nsc/io/VirtualFile.scala +++ b/src/compiler/scala/tools/nsc/io/VirtualFile.scala @@ -62,7 +62,7 @@ class VirtualFile(val name: String, _path: String) extends AbstractFile } } - def container: AbstractFile = throw new Error("not supported") + def container: AbstractFile = unsupported /** Is this abstract file a directory? */ def isDirectory: Boolean = false @@ -77,14 +77,10 @@ class VirtualFile(val name: String, _path: String) extends AbstractFile } /** Does this abstract file denote an existing file? */ - def create { - throw new UnsupportedOperationException - } + def create { unsupported } /** Delete the underlying file or directory (recursively). */ - def delete { - throw new UnsupportedOperationException - } + def delete { unsupported } /** * Returns the abstract file in this abstract directory with the @@ -104,8 +100,7 @@ class VirtualFile(val name: String, _path: String) extends AbstractFile /** Returns an abstract file with the given name. It does not * check that it exists. */ - def lookupNameUnchecked(name: String, directory: Boolean): AbstractFile = - throw new UnsupportedOperationException() + def lookupNameUnchecked(name: String, directory: Boolean) = unsupported //######################################################################## } diff --git a/src/compiler/scala/tools/nsc/io/ZipArchive.scala b/src/compiler/scala/tools/nsc/io/ZipArchive.scala index aa92b896db..9d062a45f1 100644 --- a/src/compiler/scala/tools/nsc/io/ZipArchive.scala +++ b/src/compiler/scala/tools/nsc/io/ZipArchive.scala @@ -157,8 +157,7 @@ private[io] trait ZipContainer extends AbstractFile /** Returns an abstract file with the given name. It does not * check that it exists. */ - override def lookupNameUnchecked(name: String, directory: Boolean): AbstractFile = - throw new UnsupportedOperationException() + override def lookupNameUnchecked(name: String, directory: Boolean) = unsupported /** Returns all abstract subfiles of this abstract directory. */ override def iterator: Iterator[AbstractFile] = root.iterator @@ -274,10 +273,10 @@ final class URLZipArchive(url: URL) extends AbstractFile with ZipContainer /** Methods we don't support but have to implement because of the design */ def file: JFile = null - def create: Unit = throw new UnsupportedOperationException - def delete: Unit = throw new UnsupportedOperationException - def output = throw new Error("unsupported") - def container = throw new Error("unsupported") + def create: Unit = unsupported + def delete: Unit = unsupported + def output = unsupported + def container = unsupported abstract class Entry(name: String, path: String) extends VirtualFile(name, path) { final override def path = "%s(%s)".format(URLZipArchive.this, super.path) diff --git a/src/compiler/scala/tools/nsc/javac/JavaParsers.scala b/src/compiler/scala/tools/nsc/javac/JavaParsers.scala index 16430b0a42..92dbc97965 100644 --- a/src/compiler/scala/tools/nsc/javac/JavaParsers.scala +++ b/src/compiler/scala/tools/nsc/javac/JavaParsers.scala @@ -429,7 +429,7 @@ trait JavaParsers extends JavaScanners { return Modifiers(flags, privateWithin) } } - throw new Error("should not be here") + abort("should not be here") } def typeParams(): List[TypeDef] = diff --git a/src/compiler/scala/tools/nsc/matching/MatchSupport.scala b/src/compiler/scala/tools/nsc/matching/MatchSupport.scala index 374e974170..2f50435db6 100644 --- a/src/compiler/scala/tools/nsc/matching/MatchSupport.scala +++ b/src/compiler/scala/tools/nsc/matching/MatchSupport.scala @@ -22,7 +22,6 @@ trait MatchSupport extends ast.TreeDSL { self: ParallelMatching => private final def trace = settings.Ypmatdebug.value def impossible: Nothing = abort("this never happens") - def abort(msg: String): Nothing = Predef.error(msg) object Types { import definitions._ diff --git a/src/compiler/scala/tools/nsc/models/SemanticTokens.scala b/src/compiler/scala/tools/nsc/models/SemanticTokens.scala index 577452194b..4da23b358b 100644 --- a/src/compiler/scala/tools/nsc/models/SemanticTokens.scala +++ b/src/compiler/scala/tools/nsc/models/SemanticTokens.scala @@ -262,7 +262,6 @@ class SemanticTokens(val compiler: Global) { build(arg.tpt); } } - try { //TPT=scala.Iterator[DocGenerator.this.compiler0.CompilationUnit] 260 class scala.tools.nsc.ast.Trees$TypeTree scala.Iterator[DocGenerator.this.compiler0.CompilationUnit] class scala.tools.nsc.symtab.Types$$anon$5 if ((tree.tpt eq null) || (tree.tpt.tpe eq null)) { //Console.err.println("BAD: " + tree.tpt + " in " + tree); @@ -270,11 +269,6 @@ class SemanticTokens(val compiler: Global) { //Console.err.println("TPT=" + tree.tpt + " " + tree.tpt.pos + " " + tree.tpt.getClass() + " " + tree.tpt.tpe + " " + tree.tpt.tpe.getClass() + " " + tree.tpt.tpe.getClass().getSuperclass()); build(tree.tpt); } - } catch { - case e: Error => - Console.err.println("VALDEF: " + tree + " " + tree.tpt + " " + tree.pos + " " + tree.tpt.pos); - throw e; - } //Console.err.println("RHS: " + tree.rhs + " " + tree.rhs.getClass() + " " + tree.rhs.getClass().getSuperclass()); build(tree.rhs); } @@ -554,7 +548,7 @@ class SemanticTokens(val compiler: Global) { Console.err.println("" + tree + "@" + tree.pos + " not in " + unit.source.file.name + "[" + buf.length + "]"); Thread.dumpStack() - throw new Error() + abort() } return 0 } @@ -621,7 +615,7 @@ class SemanticTokens(val compiler: Global) { Console.err.println("OFFSET=" + offset + " " + tok + " " + tok.length); Console.err.println(" " + cursor.offset + " " + gap.length); gap.length0 = offset - cursor.offset + tok.length - //throw new Error(); + //abort(); } if (offset == cursor.offset) { // replace or prepend diff --git a/src/compiler/scala/tools/nsc/reporters/ConsoleReporter.scala b/src/compiler/scala/tools/nsc/reporters/ConsoleReporter.scala index 6564cf881f..f7d380c975 100644 --- a/src/compiler/scala/tools/nsc/reporters/ConsoleReporter.scala +++ b/src/compiler/scala/tools/nsc/reporters/ConsoleReporter.scala @@ -103,18 +103,21 @@ class ConsoleReporter(val settings: Settings, reader: BufferedReader, writer: Pr writer.flush() var line = reader.readLine() if (line ne null) { - line = line.toLowerCase() - if ("abort" startsWith line) - throw new Error("user abort") - if ("resume" startsWith line) continue = false + line = line.toLowerCase() + if ("abort" startsWith line) + abort("user abort") + if ("resume" startsWith line) + continue = false } } - } catch { + } + catch { case ex: IOException => { ex.printStackTrace() - throw new Error("input read error") + abort("input read error") } } + private def abort(msg: String) = throw new Error(msg) override def flush() { writer.flush() } } diff --git a/src/compiler/scala/tools/nsc/symtab/Definitions.scala b/src/compiler/scala/tools/nsc/symtab/Definitions.scala index 0ea34235b2..edf2e49f5a 100644 --- a/src/compiler/scala/tools/nsc/symtab/Definitions.scala +++ b/src/compiler/scala/tools/nsc/symtab/Definitions.scala @@ -103,7 +103,7 @@ trait Definitions extends reflect.generic.StandardDefinitions { // exceptions and other throwables lazy val ThrowableClass = getClass(sn.Throwable) lazy val NullPointerExceptionClass = getClass(sn.NPException) - lazy val NonLocalReturnExceptionClass = getClass(sn.NLRException) + lazy val NonLocalReturnControlClass = getClass(sn.NLRControl) lazy val IndexOutOfBoundsExceptionClass = getClass(sn.IOOBException) lazy val UninitializedErrorClass = getClass("scala.UninitializedFieldError") lazy val MatchErrorClass = getClass("scala.MatchError") diff --git a/src/compiler/scala/tools/nsc/symtab/Scopes.scala b/src/compiler/scala/tools/nsc/symtab/Scopes.scala index a66e5b6cc3..ca6c93bd1c 100644 --- a/src/compiler/scala/tools/nsc/symtab/Scopes.scala +++ b/src/compiler/scala/tools/nsc/symtab/Scopes.scala @@ -326,7 +326,7 @@ trait Scopes { */ object EmptyScope extends Scope { override def enter(e: ScopeEntry) { - throw new Error("EmptyScope.enter") + abort("EmptyScope.enter") } } diff --git a/src/compiler/scala/tools/nsc/symtab/StdNames.scala b/src/compiler/scala/tools/nsc/symtab/StdNames.scala index 295dba2b46..98f87ca362 100644 --- a/src/compiler/scala/tools/nsc/symtab/StdNames.scala +++ b/src/compiler/scala/tools/nsc/symtab/StdNames.scala @@ -416,7 +416,7 @@ trait StdNames extends reflect.generic.StdNames { self: SymbolTable => val String : Name val Throwable : Name val NPException : Name // NullPointerException - val NLRException : Name = newTermName("scala.runtime.NonLocalReturnException") + val NLRControl : Name = newTermName("scala.runtime.NonLocalReturnControl") val ValueType : Name val Serializable : Name val BeanProperty : Name diff --git a/src/compiler/scala/tools/nsc/symtab/SymbolTable.scala b/src/compiler/scala/tools/nsc/symtab/SymbolTable.scala index 618c601b8f..75902568fa 100644 --- a/src/compiler/scala/tools/nsc/symtab/SymbolTable.scala +++ b/src/compiler/scala/tools/nsc/symtab/SymbolTable.scala @@ -31,6 +31,8 @@ abstract class SymbolTable extends reflect.generic.Universe def settings: Settings def rootLoader: LazyType def log(msg: AnyRef) + def abort(msg: String) = throw new Error(msg) + def abort() = throw new Error() /** Are we compiling for Java SE ? */ def forJVM: Boolean diff --git a/src/compiler/scala/tools/nsc/symtab/Symbols.scala b/src/compiler/scala/tools/nsc/symtab/Symbols.scala index 30f006201f..328b9c2311 100644 --- a/src/compiler/scala/tools/nsc/symtab/Symbols.scala +++ b/src/compiler/scala/tools/nsc/symtab/Symbols.scala @@ -740,7 +740,7 @@ trait Symbols extends reflect.generic.Symbols { self: SymbolTable => cnt += 1 // allow for two completions: // one: sourceCompleter to LazyType, two: LazyType to completed type - if (cnt == 3) throw new Error("no progress in completing " + this + ":" + tp) + if (cnt == 3) abort("no progress in completing " + this + ":" + tp) } val result = rawInfo result @@ -882,7 +882,7 @@ trait Symbols extends reflect.generic.Symbols { self: SymbolTable => * Not applicable for term symbols. */ def typeConstructor: Type = - throw new Error("typeConstructor inapplicable for " + this) + abort("typeConstructor inapplicable for " + this) /** @M -- tpe vs tpeHK: * Symbol::tpe creates a TypeRef that has dummy type arguments to get a type of kind * @@ -963,7 +963,7 @@ trait Symbols extends reflect.generic.Symbols { self: SymbolTable => else if (this.isTerm) TypeBounds(NothingClass.tpe, intersectionType(List(this.tpe, SingletonClass.tpe))) else - throw new Error("unexpected alias type: "+this) + abort("unexpected alias type: "+this) /** Reset symbol to initial state */ @@ -1421,7 +1421,7 @@ trait Symbols extends reflect.generic.Symbols { self: SymbolTable => (if (isModule) moduleClass else toplevelClass).sourceFile def sourceFile_=(f: AbstractFile) { - throw new Error("sourceFile_= inapplicable for " + this) + abort("sourceFile_= inapplicable for " + this) } def isFromClassFile: Boolean = @@ -2000,7 +2000,7 @@ trait Symbols extends reflect.generic.Symbols { self: SymbolTable => override def enclClass: Symbol = this override def toplevelClass: Symbol = this override def enclMethod: Symbol = this - override def owner: Symbol = throw new Error("no-symbol does not have owner") + override def owner: Symbol = abort("no-symbol does not have owner") override def sourceFile: AbstractFile = null override def ownerChain: List[Symbol] = List() override def ownersIterator: Iterator[Symbol] = Iterator.empty @@ -2010,7 +2010,7 @@ trait Symbols extends reflect.generic.Symbols { self: SymbolTable => override def rawInfo: Type = NoType protected def doCookJavaRawInfo() {} override def accessBoundary(base: Symbol): Symbol = RootClass - def cloneSymbolImpl(owner: Symbol): Symbol = throw new Error() + def cloneSymbolImpl(owner: Symbol): Symbol = abort() } diff --git a/src/compiler/scala/tools/nsc/symtab/Types.scala b/src/compiler/scala/tools/nsc/symtab/Types.scala index 10bebc40f8..855e6951d0 100644 --- a/src/compiler/scala/tools/nsc/symtab/Types.scala +++ b/src/compiler/scala/tools/nsc/symtab/Types.scala @@ -13,6 +13,7 @@ import ast.TreeGen import util.{HashSet, Position, NoPosition} import util.Statistics._ import Flags._ +import scala.util.control.ControlThrowable /* A standard type pattern match: case ErrorType => @@ -709,7 +710,7 @@ trait Types extends reflect.generic.Types { self: SymbolTable => if (sym == btssym) return mid else if (sym isLess btssym) hi = mid - 1 else if (btssym isLess sym) lo = mid + 1 - else throw new Error() + else abort() } -1 } @@ -2531,7 +2532,7 @@ A type's typeSymbol should never be inspected directly. case tv@TypeVar(_, constr) => tv.applyArgs(args) case ErrorType => tycon case WildcardType => tycon // needed for neg/t0226 - case _ => throw new Error(debugString(tycon)) + case _ => abort(debugString(tycon)) } /** A creator for type parameterizations @@ -3128,9 +3129,7 @@ A type's typeSymbol should never be inspected directly. if ((pre eq NoType) || (pre eq NoPrefix) || !clazz.isClass) mapOver(tp) //@M! see test pos/tcpoly_return_overriding.scala why mapOver is necessary else { - def throwError : Nothing = throw new Error( - "" + tp + sym.locationString + " cannot be instantiated from " + pre.widen - ) + def throwError = abort("" + tp + sym.locationString + " cannot be instantiated from " + pre.widen) def instParam(ps: List[Symbol], as: List[Type]): Type = if (ps.isEmpty) throwError @@ -3547,9 +3546,9 @@ A type's typeSymbol should never be inspected directly. } } - class MissingAliasException extends Exception - val missingAliasException = new MissingAliasException - class MissingTypeException extends Exception + class MissingAliasControl extends ControlThrowable + val missingAliasException = new MissingAliasControl + class MissingTypeControl extends ControlThrowable object adaptToNewRunMap extends TypeMap { private def adaptToNewRun(pre: Type, sym: Symbol): Symbol = { @@ -3561,7 +3560,7 @@ A type's typeSymbol should never be inspected directly. var rebind0 = pre.findMember(sym.name, BRIDGE, 0, true) if (rebind0 == NoSymbol) { if (sym.isAliasType) throw missingAliasException - throw new MissingTypeException // For build manager purposes + throw new MissingTypeControl // For build manager purposes //assert(false, pre+"."+sym+" does no longer exist, phase = "+phase) } /** The two symbols have the same fully qualified name */ @@ -3606,9 +3605,9 @@ A type's typeSymbol should never be inspected directly. if ((pre1 eq pre) && (sym1 eq sym) && (args1 eq args)/* && sym.isExternal*/) tp else typeRef(pre1, sym1, args1) } catch { - case ex: MissingAliasException => + case ex: MissingAliasControl => apply(tp.dealias) - case _: MissingTypeException => + case _: MissingTypeControl => NoType } } @@ -4742,7 +4741,7 @@ A type's typeSymbol should never be inspected directly. res case TypeVar(_, constr) => if (constr.instValid) constr.inst - else throw new Error("trying to do lub/glb of typevar "+tp) + else abort("trying to do lub/glb of typevar "+tp) case t => t } val strippedTypes = ts mapConserve (stripType) @@ -5119,15 +5118,15 @@ A type's typeSymbol should never be inspected directly. // Errors and Diagnostics ----------------------------------------------------- - /** An exception signalling a type error */ - class TypeError(var pos: Position, val msg: String) extends java.lang.Error(msg) { + /** A throwable signalling a type error */ + class TypeError(var pos: Position, val msg: String) extends Throwable(msg) with ControlThrowable { def this(msg: String) = this(NoPosition, msg) } - class NoCommonType(tps: List[Type]) extends java.lang.Error( - "lub/glb of incompatible types: " + tps.mkString("", " and ", "")) + class NoCommonType(tps: List[Type]) extends Throwable( + "lub/glb of incompatible types: " + tps.mkString("", " and ", "")) with ControlThrowable - /** An exception signalling a malformed type */ + /** A throwable signalling a malformed type */ class MalformedType(msg: String) extends TypeError(msg) { def this(pre: Type, tp: String) = this("malformed type: " + pre + "#" + tp) } diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala index 745761a065..edf81a97ad 100644 --- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala +++ b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala @@ -95,7 +95,8 @@ abstract class ClassfileParser { parseHeader this.pool = new ConstantPool parseClass() - } catch { + } + catch { case e: MissingRequirementError => handleMissing(e) case e: RuntimeException => handleError(e) } diff --git a/src/compiler/scala/tools/nsc/symtab/clr/TypeParser.scala b/src/compiler/scala/tools/nsc/symtab/clr/TypeParser.scala index a1a4545894..92ff741b20 100644 --- a/src/compiler/scala/tools/nsc/symtab/clr/TypeParser.scala +++ b/src/compiler/scala/tools/nsc/symtab/clr/TypeParser.scala @@ -42,7 +42,7 @@ abstract class TypeParser { def parse(typ: MSILType, root: Symbol) { - def handleError(e: Exception) = { + def handleError(e: Throwable) = { if (settings.debug.value) e.printStackTrace() //debug throw new IOException("type '" + typ.FullName + "' is broken\n(" + e.getMessage() + ")") } diff --git a/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala b/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala index 956db2767e..f55afdb2b0 100644 --- a/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala +++ b/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala @@ -243,7 +243,7 @@ abstract class AddInterfaces extends InfoTransform { tree.symbol = implMethod new ChangeOwnerAndReturnTraverser(ifaceMethod, implMethod)(tree) case None => - throw new Error("implMethod missing for " + ifaceMethod) + abort("implMethod missing for " + ifaceMethod) } private def implMemberDef(tree: Tree): Tree = diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala index 79bc6bbba5..f37b809744 100644 --- a/src/compiler/scala/tools/nsc/transform/Erasure.scala +++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala @@ -10,6 +10,7 @@ package transform import scala.tools.nsc.symtab.classfile.ClassfileConstants._ import scala.collection.mutable.{HashMap,ListBuffer} import scala.collection.immutable.Set +import scala.util.control.ControlThrowable import symtab._ import Flags._ @@ -633,7 +634,7 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer with ast. Console.println("exception when typing " + tree) Console.println(er.msg + " in file " + context.owner.sourceFile) er.printStackTrace - throw new Error + abort() } def adaptCase(cdef: CaseDef): CaseDef = { val body1 = adaptToType(cdef.body, tree1.tpe) @@ -1036,18 +1037,13 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer with ast. tpt.tpe = erasure(tree.symbol.tpe).resultType result case _ => - case class MyError(count : Int, ex : AssertionError) extends Error(ex.getMessage) - try { - super.transform(tree1) setType null - } catch { - case e @ MyError(n, ex) if n > 5 => throw e - case MyError(n,ex) => + case class LoopControl(count: Int, ex : AssertionError) extends Throwable(ex.getMessage) with ControlThrowable + + try super.transform(tree1) setType null + catch { + case LoopControl(n, ex) if n <= 5 => Console.println(tree1) - throw MyError(n + 1, ex) -// case ex : AssertionError => -// Console.println(tree1) -// throw MyError(0, ex) -// case ex => throw ex + throw LoopControl(n + 1, ex) } } } diff --git a/src/compiler/scala/tools/nsc/transform/LiftCode.scala b/src/compiler/scala/tools/nsc/transform/LiftCode.scala index 574ec23cdb..951fa53041 100644 --- a/src/compiler/scala/tools/nsc/transform/LiftCode.scala +++ b/src/compiler/scala/tools/nsc/transform/LiftCode.scala @@ -79,7 +79,7 @@ abstract class LiftCode extends Transform with Reifiers { gen.mkAttributedRef(definitions.getModule(name)) else { val name = className(c) - if (name.length() == 0) throw new Error("don't know how to inject " + value) + if (name.length() == 0) abort("don't know how to inject " + value) val injectedArgs = new ListBuffer[Tree] for (i <- 0 until c.productArity) injectedArgs += inject(c.productElement(i)) @@ -103,7 +103,7 @@ abstract class LiftCode extends Transform with Reifiers { case null => gen.mkAttributedRef(definitions.getModule("scala.reflect.NoType")) case _ => - throw new Error("don't know how to inject " + value) + abort("don't know how to inject " + value) } } } // Injector diff --git a/src/compiler/scala/tools/nsc/transform/UnCurry.scala b/src/compiler/scala/tools/nsc/transform/UnCurry.scala index c9c7548e6d..c22eae60c5 100644 --- a/src/compiler/scala/tools/nsc/transform/UnCurry.scala +++ b/src/compiler/scala/tools/nsc/transform/UnCurry.scala @@ -196,7 +196,7 @@ abstract class UnCurry extends InfoTransform with TypingTransformers { /** The type of a non-local return expression with given argument type */ private def nonLocalReturnExceptionType(argtype: Type) = - appliedType(NonLocalReturnExceptionClass.typeConstructor, List(argtype)) + appliedType(NonLocalReturnControlClass.typeConstructor, List(argtype)) /** A hashmap from method symbols to non-local return keys */ private val nonLocalReturnKeys = new HashMap[Symbol, Symbol] @@ -214,7 +214,7 @@ abstract class UnCurry extends InfoTransform with TypingTransformers { /** Generate a non-local return throw with given return expression from given method. * I.e. for the method's non-local return key, generate: * - * throw new NonLocalReturnException(key, expr) + * throw new NonLocalReturnControl(key, expr) * todo: maybe clone a pre-existing exception instead? * (but what to do about excaptions that miss their targets?) */ @@ -233,7 +233,7 @@ abstract class UnCurry extends InfoTransform with TypingTransformers { * try { * body * } catch { - * case ex: NonLocalReturnException[_] => + * case ex: NonLocalReturnControl[_] => * if (ex.key().eq(key)) ex.value() * else throw ex * } @@ -245,7 +245,7 @@ abstract class UnCurry extends InfoTransform with TypingTransformers { val ex = meth.newValue(body.pos, nme.ex) setInfo extpe val pat = Bind(ex, Typed(Ident(nme.WILDCARD), - AppliedTypeTree(Ident(NonLocalReturnExceptionClass), + AppliedTypeTree(Ident(NonLocalReturnControlClass), List(Bind(nme.WILDCARD.toTypeName, EmptyTree))))) val rhs = diff --git a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala index 7ca4dcf885..614879b137 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala @@ -263,7 +263,7 @@ trait Contexts { self: Analyzer => if (diagnostic.isEmpty) "" else diagnostic.mkString("\n","\n", "") - def error(pos: Position, err: Error) { + def error(pos: Position, err: Throwable) { val msg = err.getMessage() + diagString if (reportGeneralErrors) unit.error(pos, if (checking) "**** ERROR DURING INTERNAL CHECKING ****\n" + msg else msg) diff --git a/src/compiler/scala/tools/nsc/typechecker/DeVirtualize.scala b/src/compiler/scala/tools/nsc/typechecker/DeVirtualize.scala index 8a5df0f610..71078ca564 100644 --- a/src/compiler/scala/tools/nsc/typechecker/DeVirtualize.scala +++ b/src/compiler/scala/tools/nsc/typechecker/DeVirtualize.scala @@ -297,7 +297,7 @@ abstract class DeVirtualize extends InfoTransform with TypingTransformers { private def copyType(tpe: Type): Type = tpe match { case MethodType(formals, restpe) => MethodType(formals, copyType(restpe)) case PolyType(List(), restpe) => PolyType(List(), copyType(restpe)) - case PolyType(_, _) => throw new Error("bad case: "+tpe) + case PolyType(_, _) => abort("bad case: "+tpe) case _ => owner.thisType.memberType(abstractType(clazz)) } def getInfo = copyType(clazz.primaryConstructor.tpe) diff --git a/src/compiler/scala/tools/nsc/typechecker/Infer.scala b/src/compiler/scala/tools/nsc/typechecker/Infer.scala index 3738e9a5ec..e773dedba3 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Infer.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Infer.scala @@ -8,7 +8,7 @@ package scala.tools.nsc package typechecker import scala.collection.mutable.ListBuffer -import scala.util.control.ControlException +import scala.util.control.ControlThrowable import symtab.Flags._ /** This trait ... @@ -79,7 +79,7 @@ trait Infer { // error when built with scalac /*private*/ - class NoInstance(msg: String) extends RuntimeException(msg) with ControlException + class NoInstance(msg: String) extends Throwable(msg) with ControlThrowable /*private*/ class DeferredNoInstance(getmsg: () => String) extends NoInstance("") { diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index f557cf7b10..a41dcc24f7 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -12,7 +12,7 @@ package scala.tools.nsc package typechecker import scala.collection.mutable.{HashMap, ListBuffer} -import scala.util.control.ControlException +import scala.util.control.ControlThrowable import scala.tools.nsc.interactive.RangePositions import scala.tools.nsc.util.{Set, SourceFile, BatchSourceFile} import symtab.Flags._ @@ -4082,7 +4082,7 @@ trait Typers { self: Analyzer => assert(onlyPresentation) // should not happen in normal circumstances. tree setType tree.symbol.tpe case _ => - throw new Error("unexpected tree: " + tree.getClass + "\n" + tree)//debug + abort("unexpected tree: " + tree.getClass + "\n" + tree)//debug } } @@ -4133,7 +4133,6 @@ trait Typers { self: Analyzer => if (phase.id <= currentRun.typerPhase.id) signalDone(context.asInstanceOf[analyzer.Context], tree, result) result } catch { - case ex: ControlException => throw ex case ex: TypeError => tree.tpe = null if (printTypings) println("caught "+ex+" in typed: "+tree);//DEBUG @@ -4145,13 +4144,9 @@ trait Typers { self: Analyzer => if ((context ne null) && (context.unit ne null) && (context.unit.source ne null) && (tree ne null)) logError("AT: " + (tree.pos).dbgString, ex); - throw(ex) -/* - case ex: java.lang.Error => - Console.println("exception when typing "+tree+", pt = "+pt) throw ex -*/ //debug - } finally { + } + finally { if (Statistics.enabled) { val t = currentTime() microsByType(pendingTreeTypes.head) += ((t - typerTime) / 1000).toInt diff --git a/src/compiler/scala/tools/nsc/util/CommandLineParser.scala b/src/compiler/scala/tools/nsc/util/CommandLineParser.scala index c3c99b1e1f..680c2130d7 100644 --- a/src/compiler/scala/tools/nsc/util/CommandLineParser.scala +++ b/src/compiler/scala/tools/nsc/util/CommandLineParser.scala @@ -100,9 +100,9 @@ object CommandLineParser extends RegexParsers with ParserUtil { lazy val argument: Parser[String] = squoted | dquoted | token lazy val commandLine: Parser[List[String]] = phrase(repsep(argument, whiteSpace)) - class ParseError(msg: String) extends RuntimeException(msg) + class ParseException(msg: String) extends RuntimeException(msg) - def tokenize(line: String): List[String] = tokenize(line, x => throw new ParseError(x)) + def tokenize(line: String): List[String] = tokenize(line, x => throw new ParseException(x)) def tokenize(line: String, errorFn: String => Unit): List[String] = { parse(commandLine, line.trim) match { case Success(args, _) => args diff --git a/src/compiler/scala/tools/nsc/util/WorkScheduler.scala b/src/compiler/scala/tools/nsc/util/WorkScheduler.scala index b4ecbf8a71..e309b19b76 100644 --- a/src/compiler/scala/tools/nsc/util/WorkScheduler.scala +++ b/src/compiler/scala/tools/nsc/util/WorkScheduler.scala @@ -8,7 +8,7 @@ class WorkScheduler { type Action = () => Unit private var todo = new Queue[Action] - private var except = new Queue[Exception] + private var throwables = new Queue[Throwable] /** Called from server: block until todo list is nonempty */ def waitForMoreWork() = synchronized { @@ -30,12 +30,12 @@ class WorkScheduler { /** Called from server: return optional exception posted by client * Reset to no exception. */ - def pollException(): Option[Exception] = synchronized { - if (except.isEmpty) + def pollThrowable(): Option[Throwable] = synchronized { + if (throwables.isEmpty) None else { - val result = Some(except.dequeue()) - if (!except.isEmpty) + val result = Some(throwables.dequeue()) + if (!throwables.isEmpty) postWorkItem { () => } result } @@ -55,8 +55,8 @@ class WorkScheduler { /** Called from client: * Require an exception to be thrown on next poll. */ - def raise(exc: Exception) = synchronized { - except enqueue exc + def raise(exc: Throwable) = synchronized { + throwables enqueue exc postWorkItem { () => } } } diff --git a/src/intellij/scala-lang.ipr b/src/intellij/scala-lang.ipr index 8a801be5db..45af31680c 100644 --- a/src/intellij/scala-lang.ipr +++ b/src/intellij/scala-lang.ipr @@ -999,7 +999,7 @@ <file url="file://$PROJECT_DIR$/../dotnet-library/scala/reflect/Manifest.scala" /> <file url="file://$PROJECT_DIR$/../dotnet-library/scala/reflect/ScalaBeanInfo.scala" /> <file url="file://$PROJECT_DIR$/../dotnet-library/scala/runtime/MethodCache.scala" /> - <file url="file://$PROJECT_DIR$/../dotnet-library/scala/runtime/NonLocalReturnException.scala" /> + <file url="file://$PROJECT_DIR$/../dotnet-library/scala/runtime/NonLocalReturnControl.scala" /> <file url="file://$PROJECT_DIR$/../dotnet-library/scala/runtime/RichChar.scala" /> <file url="file://$PROJECT_DIR$/../dotnet-library/scala/runtime/RichClass.scala" /> <file url="file://$PROJECT_DIR$/../dotnet-library/scala/runtime/RichDouble.scala" /> diff --git a/src/library/scala/NotDefinedError.scala b/src/library/scala/NotDefinedError.scala index c1939a4e9a..a47613fb9a 100644 --- a/src/library/scala/NotDefinedError.scala +++ b/src/library/scala/NotDefinedError.scala @@ -14,4 +14,5 @@ package scala /** * @since 2.0 */ +@deprecated("Use a custom Error class instead") final class NotDefinedError(msg: String) extends Error("not defined: " + msg) diff --git a/src/library/scala/runtime/NonLocalReturnControl.scala b/src/library/scala/runtime/NonLocalReturnControl.scala new file mode 100644 index 0000000000..5591d4871b --- /dev/null +++ b/src/library/scala/runtime/NonLocalReturnControl.scala @@ -0,0 +1,16 @@ +/* __ *\ +** ________ ___ / / ___ Scala API ** +** / __/ __// _ | / / / _ | (c) 2002-2010, LAMP/EPFL ** +** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** +** /____/\___/_/ |_/____/_/ | | ** +** |/ ** +\* */ + +// $Id$ + + +package scala.runtime + +import scala.util.control.ControlThrowable + +class NonLocalReturnControl[T](val key: AnyRef, val value: T) extends ControlThrowable diff --git a/src/library/scala/runtime/NonLocalReturnException.scala b/src/library/scala/runtime/NonLocalReturnException.scala index 4bd8ceb058..19a216be7c 100644 --- a/src/library/scala/runtime/NonLocalReturnException.scala +++ b/src/library/scala/runtime/NonLocalReturnException.scala @@ -11,6 +11,9 @@ package scala.runtime -import scala.util.control.ControlException +import scala.util.control.ControlThrowable -class NonLocalReturnException[T](val key: AnyRef, val value: T) extends RuntimeException with ControlException +/** !!! This class has been replaced by NonLocalReturnControl and should be deleted. + * But, it can't be deleted until starr is updated to use the new name. + */ +class NonLocalReturnException[T](val key: AnyRef, val value: T) extends ControlThrowable diff --git a/src/library/scala/runtime/ScalaRunTime.scala b/src/library/scala/runtime/ScalaRunTime.scala index a65ec05401..82573bf4b1 100644 --- a/src/library/scala/runtime/ScalaRunTime.scala +++ b/src/library/scala/runtime/ScalaRunTime.scala @@ -16,7 +16,7 @@ import scala.collection.{ Seq, IndexedSeq } import scala.collection.mutable.WrappedArray import scala.collection.immutable.{ List, Stream, Nil, :: } import scala.xml.{ Node, MetaData } -import scala.util.control.ControlException +import scala.util.control.ControlThrowable /* The object <code>ScalaRunTime</code> provides ... */ @@ -124,7 +124,7 @@ object ScalaRunTime { private var exception: Throwable = try { run() ; null } catch { - case e: ControlException => throw e // don't catch non-local returns etc + case e: ControlThrowable => throw e // don't catch non-local returns etc case e: Throwable => e } diff --git a/src/library/scala/util/control/Breaks.scala b/src/library/scala/util/control/Breaks.scala index 7ae4cba63a..1f06f04418 100644 --- a/src/library/scala/util/control/Breaks.scala +++ b/src/library/scala/util/control/Breaks.scala @@ -28,14 +28,14 @@ package scala.util.control */ class Breaks { - private val breakException = new BreakException + private val breakException = new BreakControl /** A block from which one can exit with a `break''. */ def breakable(op: => Unit) { try { op } catch { - case ex: BreakException => + case ex: BreakControl => if (ex ne breakException) throw ex } } @@ -61,5 +61,5 @@ class Breaks { */ object Breaks extends Breaks -private class BreakException extends RuntimeException with ControlException +private class BreakControl extends ControlThrowable diff --git a/src/library/scala/util/control/ControlException.scala b/src/library/scala/util/control/ControlThrowable.scala index 73f2b31e89..090bec4e98 100644 --- a/src/library/scala/util/control/ControlException.scala +++ b/src/library/scala/util/control/ControlThrowable.scala @@ -21,19 +21,19 @@ package scala.util.control * * <p>Instances of <code>Throwable</code> subclasses marked in * this way should not normally be caught. Where catch-all behaviour is - * required <code>ControlException</code>s should be propagated, for + * required <code>ControlThrowable</code>s should be propagated, for * example,</p> * * <pre> - * import scala.util.control.ControlException + * import scala.util.control.ControlThrowable * * try { * // Body might throw arbitrarily * } catch { - * case ce : ControlException => throw ce // propagate + * case ce : ControlThrowable => throw ce // propagate * case t : Exception => log(t) // log and suppress * </pre> * * @author Miles Sabin */ -trait ControlException extends Throwable with NoStackTrace +trait ControlThrowable extends Throwable with NoStackTrace diff --git a/src/library/scala/xml/parsing/FatalError.scala b/src/library/scala/xml/parsing/FatalError.scala index 01b68f6591..73634298fa 100644 --- a/src/library/scala/xml/parsing/FatalError.scala +++ b/src/library/scala/xml/parsing/FatalError.scala @@ -10,7 +10,8 @@ package scala.xml -package parsing; +package parsing - -case class FatalError(msg:String) extends java.lang.RuntimeException(msg); +/** !!! This is poorly named, but I guess it's in the API. + */ +case class FatalError(msg: String) extends java.lang.RuntimeException(msg) diff --git a/src/library/scala/xml/parsing/MarkupParserCommon.scala b/src/library/scala/xml/parsing/MarkupParserCommon.scala index ba1402d55f..936515852b 100644 --- a/src/library/scala/xml/parsing/MarkupParserCommon.scala +++ b/src/library/scala/xml/parsing/MarkupParserCommon.scala @@ -241,7 +241,7 @@ private[scala] trait MarkupParserCommon extends TokenTests { if (ch == head && peek(rest)) return handler(positioner(), sb.toString) else if (ch == SU) - truncatedError("") // throws TruncatedXML in compiler + truncatedError("") // throws TruncatedXMLControl in compiler sb append ch nextch |