diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2013-07-24 21:56:25 +1000 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2013-07-24 21:56:25 +1000 |
commit | 3bdb1d69a5c24443726ec7e610fef18ba7d34297 (patch) | |
tree | 1df9624f107d21f711bde6d8386ff441f8dc9669 | |
parent | c78081090ef2fddcb013c908b3a986d2769a9fe2 (diff) | |
download | scala-async-3bdb1d69a5c24443726ec7e610fef18ba7d34297.tar.gz scala-async-3bdb1d69a5c24443726ec7e610fef18ba7d34297.tar.bz2 scala-async-3bdb1d69a5c24443726ec7e610fef18ba7d34297.zip |
Support await in throws.
Also support AsyncId.async[Nothing], which was triggering a NPE
in the generated `null.asInstanceOf[Nothing]`.
-rw-r--r-- | src/main/scala/scala/async/internal/AnfTransform.scala | 4 | ||||
-rw-r--r-- | src/main/scala/scala/async/internal/AsyncId.scala | 6 | ||||
-rw-r--r-- | src/test/scala/scala/async/run/anf/AnfTransformSpec.scala | 10 |
3 files changed, 18 insertions, 2 deletions
diff --git a/src/main/scala/scala/async/internal/AnfTransform.scala b/src/main/scala/scala/async/internal/AnfTransform.scala index 49cc3c3..7b30590 100644 --- a/src/main/scala/scala/async/internal/AnfTransform.scala +++ b/src/main/scala/scala/async/internal/AnfTransform.scala @@ -164,6 +164,10 @@ private[async] trait AnfTransform { val stats :+ expr = linearize.transformToList(qual) stats :+ treeCopy.Select(tree, expr, sel) + case Throw(expr) => + val stats :+ expr1 = linearize.transformToList(expr) + stats :+ treeCopy.Throw(tree, expr1) + case treeInfo.Applied(fun, targs, argss) if argss.nonEmpty => // we an assume that no await call appears in a by-name argument position, // this has already been checked. diff --git a/src/main/scala/scala/async/internal/AsyncId.scala b/src/main/scala/scala/async/internal/AsyncId.scala index 394f587..4334088 100644 --- a/src/main/scala/scala/async/internal/AsyncId.scala +++ b/src/main/scala/scala/async/internal/AsyncId.scala @@ -23,7 +23,9 @@ object AsyncId extends AsyncBase { */ object IdentityFutureSystem extends FutureSystem { - class Prom[A](var a: A) + class Prom[A] { + var a: A = _ + } type Fut[A] = A type ExecContext = Unit @@ -39,7 +41,7 @@ object IdentityFutureSystem extends FutureSystem { def execContextType: Type = weakTypeOf[Unit] def createProm[A: WeakTypeTag]: Expr[Prom[A]] = reify { - new Prom(null.asInstanceOf[A]) + new Prom() } def promiseToFuture[A: WeakTypeTag](prom: Expr[Prom[A]]) = reify { diff --git a/src/test/scala/scala/async/run/anf/AnfTransformSpec.scala b/src/test/scala/scala/async/run/anf/AnfTransformSpec.scala index e389a19..ed9f506 100644 --- a/src/test/scala/scala/async/run/anf/AnfTransformSpec.scala +++ b/src/test/scala/scala/async/run/anf/AnfTransformSpec.scala @@ -348,4 +348,14 @@ class AnfTransformSpec { foo(await(0), List(id(1), id(2), id(3)): _*) } mustBe (List(1, 2, 3)) } + + @Test + def awaitInThrow() { + import _root_.scala.async.internal.AsyncId.{async, await} + intercept[Exception]( + async { + throw new Exception("msg: " + await(0)) + } + ).getMessage mustBe "msg: 0" + } } |