diff options
author | Paul Phillips <paulp@improving.org> | 2009-12-02 04:59:19 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2009-12-02 04:59:19 +0000 |
commit | 75d02a1a5278b49487cef7669c998d4b052bbb2d (patch) | |
tree | 2a8ef5d6c8a06704ccf50445d8345293040e67d3 | |
parent | f54e15370e7e90aa303103c8d3aadb22d0164b10 (diff) | |
download | scala-75d02a1a5278b49487cef7669c998d4b052bbb2d.tar.gz scala-75d02a1a5278b49487cef7669c998d4b052bbb2d.tar.bz2 scala-75d02a1a5278b49487cef7669c998d4b052bbb2d.zip |
Making the Try/Catch/Finally in ScalaRunTime to...
Making the Try/Catch/Finally in ScalaRunTime to do what it looks like
they were intended to do. (This code looks like it dates from the Nixon
administration, so deleting it might be better.)
-rw-r--r-- | src/library/scala/runtime/ExceptionHandling.java | 26 | ||||
-rw-r--r-- | src/library/scala/runtime/ScalaRunTime.scala | 50 |
2 files changed, 26 insertions, 50 deletions
diff --git a/src/library/scala/runtime/ExceptionHandling.java b/src/library/scala/runtime/ExceptionHandling.java deleted file mode 100644 index 73a6647ed2..0000000000 --- a/src/library/scala/runtime/ExceptionHandling.java +++ /dev/null @@ -1,26 +0,0 @@ -/* __ *\ -** ________ ___ / / ___ Scala API ** -** / __/ __// _ | / / / _ | (c) 2002-2009, LAMP/EPFL ** -** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** -** /____/\___/_/ |_/____/_/ | | ** -** |/ ** -\* */ - -// $Id$ - - -package scala.runtime; - - -public abstract class ExceptionHandling { - - public static Throwable tryCatch(Runnable runnable) { - try { - runnable.run(); - return null; - } catch (Throwable exception) { - return exception; - } - } - -} diff --git a/src/library/scala/runtime/ScalaRunTime.scala b/src/library/scala/runtime/ScalaRunTime.scala index 015d05d62e..c193796033 100644 --- a/src/library/scala/runtime/ScalaRunTime.scala +++ b/src/library/scala/runtime/ScalaRunTime.scala @@ -15,6 +15,7 @@ import scala.reflect.ClassManifest import scala.collection.Seq import scala.collection.mutable._ import scala.collection.immutable.{ List, Stream, Nil, :: } +import scala.util.control.ControlException /* The object <code>ScalaRunTime</code> provides ... */ @@ -62,32 +63,33 @@ object ScalaRunTime { def checkInitialized[T <: AnyRef](x: T): T = if (x == null) throw new UninitializedError else x - abstract class Try[a] { - def Catch[b >: a](handler: PartialFunction[Throwable, b]): b - def Finally(handler: Unit): a + abstract class Try[+A] { + def Catch[B >: A](handler: PartialFunction[Throwable, B]): B + def Finally(fin: => Unit): A } - def Try[a](block: => a): Try[a] = new Try[a] with Runnable { - var result: a = _ - var exception: Throwable = ExceptionHandling.tryCatch(this) - - def run(): Unit = result = block - - def Catch[b >: a](handler: PartialFunction[Throwable, b]): b = - if (exception eq null) - result.asInstanceOf[b] - // !!! else if (exception is LocalReturn) - // !!! // ... - else if (handler isDefinedAt exception) - handler(exception) - else - throw exception - - def Finally(handler: Unit): a = - if (exception eq null) - result.asInstanceOf[a] - else - throw exception + def Try[A](block: => A): Try[A] = new Try[A] with Runnable { + private var result: A = _ + private var exception: Throwable = + try { run() ; null } + catch { + case e: ControlException => throw e // don't catch non-local returns etc + case e: Throwable => e + } + + def run() { result = block } + + def Catch[B >: A](handler: PartialFunction[Throwable, B]): B = + if (exception == null) result + else if (handler isDefinedAt exception) handler(exception) + else throw exception + + def Finally(fin: => Unit): A = { + fin + + if (exception == null) result + else throw exception + } } def _toString(x: Product): String = |