aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/scala/async/Async.scala
diff options
context:
space:
mode:
authorphaller <hallerp@gmail.com>2012-11-13 01:07:28 +0100
committerphaller <hallerp@gmail.com>2012-11-16 09:42:30 +0100
commitc4ceea0ca8538297622634121b99e2357ca72acb (patch)
tree31c2265496175dde52244f2506c94997fd9194dd /src/main/scala/scala/async/Async.scala
parentf451904320d02c7dbe6b298f6ff790ca5cf5f080 (diff)
downloadscala-async-c4ceea0ca8538297622634121b99e2357ca72acb.tar.gz
scala-async-c4ceea0ca8538297622634121b99e2357ca72acb.tar.bz2
scala-async-c4ceea0ca8538297622634121b99e2357ca72acb.zip
Add selective ANF transform
- Does not descend into class and module defs - Adds several tests, including tests for if-else
Diffstat (limited to 'src/main/scala/scala/async/Async.scala')
-rw-r--r--src/main/scala/scala/async/Async.scala12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/main/scala/scala/async/Async.scala b/src/main/scala/scala/async/Async.scala
index b71ce74..8fc7ccf 100644
--- a/src/main/scala/scala/async/Async.scala
+++ b/src/main/scala/scala/async/Async.scala
@@ -74,7 +74,15 @@ abstract class AsyncBase {
import builder.defn._
import builder.name
import builder.futureSystemOps
- val (stats, expr) = body.tree match {
+
+ val transform = new AnfTransform[c.type](c)
+ val typedBody = c.typeCheck(body.tree)
+ val stats1 :+ expr1 = transform.anf.transformToList(typedBody)
+ val btree = c.typeCheck(Block(stats1, expr1))
+
+ AsyncUtils.vprintln(s"ANF transform expands to:\n $btree")
+
+ val (stats, expr) = btree match {
case Block(stats, expr) => (stats, expr)
case tree => (Nil, tree)
}
@@ -86,7 +94,7 @@ abstract class AsyncBase {
val handlerCases: List[CaseDef] = asyncBlockBuilder.mkCombinedHandlerCases[T]()
val initStates = asyncBlockBuilder.asyncStates.init
- val localVarTrees = initStates.flatMap(_.allVarDefs).toList
+ val localVarTrees = asyncBlockBuilder.asyncStates.flatMap(_.allVarDefs).toList
/*
lazy val onCompleteHandler = (tr: Try[Any]) => state match {