diff options
author | phaller <hallerp@gmail.com> | 2012-11-13 01:07:28 +0100 |
---|---|---|
committer | phaller <hallerp@gmail.com> | 2012-11-16 09:42:30 +0100 |
commit | c4ceea0ca8538297622634121b99e2357ca72acb (patch) | |
tree | 31c2265496175dde52244f2506c94997fd9194dd /src/main/scala/scala/async/Async.scala | |
parent | f451904320d02c7dbe6b298f6ff790ca5cf5f080 (diff) | |
download | scala-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.scala | 12 |
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 { |