aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/scala/async/AsyncWithCPSFallback.scala
diff options
context:
space:
mode:
authorphaller <hallerp@gmail.com>2012-12-19 00:22:13 +0100
committerphaller <hallerp@gmail.com>2012-12-19 00:22:13 +0100
commite8e84ba8d3e3ebf266250cdb48176a9fef5361d9 (patch)
treefc0fd882aa34b8b5e5571e26164c62b551e2c9fe /src/main/scala/scala/async/AsyncWithCPSFallback.scala
parent3859c11bca3ce9d9d2b18ec629dcc4b6218cf2e0 (diff)
downloadscala-async-e8e84ba8d3e3ebf266250cdb48176a9fef5361d9.tar.gz
scala-async-e8e84ba8d3e3ebf266250cdb48176a9fef5361d9.tar.bz2
scala-async-e8e84ba8d3e3ebf266250cdb48176a9fef5361d9.zip
New fix for #1861: Add fall-back to CPS for all unsupported uses of await
This is a re-implementation of a previous fix. It is more modular, since it enables the definition of a CPS-based fall-back as a subclass of `AsyncBase`. Thus, it's possible to define fall-back-enabled subclasses of `AsyncBase` targetting not only Scala Futures.
Diffstat (limited to 'src/main/scala/scala/async/AsyncWithCPSFallback.scala')
-rw-r--r--src/main/scala/scala/async/AsyncWithCPSFallback.scala31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/main/scala/scala/async/AsyncWithCPSFallback.scala b/src/main/scala/scala/async/AsyncWithCPSFallback.scala
new file mode 100644
index 0000000..39e43a3
--- /dev/null
+++ b/src/main/scala/scala/async/AsyncWithCPSFallback.scala
@@ -0,0 +1,31 @@
+package scala.async
+
+import scala.language.experimental.macros
+
+import scala.reflect.macros.Context
+import scala.util.continuations._
+
+object AsyncWithCPSFallback extends AsyncBase {
+
+ import scala.concurrent.{Future, ExecutionContext}
+ import ExecutionContext.Implicits.global
+
+ lazy val futureSystem = ScalaConcurrentFutureSystem
+ type FS = ScalaConcurrentFutureSystem.type
+
+ /* Fall-back for `await` when it is called at an unsupported position.
+ */
+ override def awaitFallback[T, U](awaitable: futureSystem.Fut[T], p: futureSystem.Prom[U]): T @cpsParam[U, Unit] =
+ shift {
+ (k: (T => U)) =>
+ awaitable onComplete {
+ case tr => p.success(k(tr.get))
+ }
+ }
+
+ override def fallbackEnabled = true
+
+ def async[T](body: T) = macro asyncImpl[T]
+
+ override def asyncImpl[T: c.WeakTypeTag](c: Context)(body: c.Expr[T]): c.Expr[Future[T]] = super.asyncImpl[T](c)(body)
+}