From 3bdb1d69a5c24443726ec7e610fef18ba7d34297 Mon Sep 17 00:00:00 2001 From: Jason Zaugg Date: Wed, 24 Jul 2013 21:56:25 +1000 Subject: Support await in throws. Also support AsyncId.async[Nothing], which was triggering a NPE in the generated `null.asInstanceOf[Nothing]`. --- src/main/scala/scala/async/internal/AnfTransform.scala | 4 ++++ src/main/scala/scala/async/internal/AsyncId.scala | 6 ++++-- src/test/scala/scala/async/run/anf/AnfTransformSpec.scala | 10 ++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) (limited to 'src') 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" + } } -- cgit v1.2.3