aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-07-24 21:56:25 +1000
committerJason Zaugg <jzaugg@gmail.com>2013-07-24 21:56:25 +1000
commit3bdb1d69a5c24443726ec7e610fef18ba7d34297 (patch)
tree1df9624f107d21f711bde6d8386ff441f8dc9669
parentc78081090ef2fddcb013c908b3a986d2769a9fe2 (diff)
downloadscala-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.scala4
-rw-r--r--src/main/scala/scala/async/internal/AsyncId.scala6
-rw-r--r--src/test/scala/scala/async/run/anf/AnfTransformSpec.scala10
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"
+ }
}