diff options
author | phaller <hallerp@gmail.com> | 2012-12-19 00:22:13 +0100 |
---|---|---|
committer | phaller <hallerp@gmail.com> | 2012-12-19 00:22:13 +0100 |
commit | e8e84ba8d3e3ebf266250cdb48176a9fef5361d9 (patch) | |
tree | fc0fd882aa34b8b5e5571e26164c62b551e2c9fe /src/main/scala/scala/async/AsyncWithCPSFallback.scala | |
parent | 3859c11bca3ce9d9d2b18ec629dcc4b6218cf2e0 (diff) | |
download | scala-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.scala | 31 |
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) +} |