aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/scala/async/internal/AsyncTransform.scala
diff options
context:
space:
mode:
authorPhilipp Haller <hallerp@gmail.com>2013-10-19 12:45:00 +0200
committerPhilipp Haller <hallerp@gmail.com>2013-10-22 14:41:37 +0200
commit62f22d41cfabc7d0d87c5afef64c1c9015e2cf5e (patch)
treeb26f16fddb9ffc1dd002baa36ba8292e2418dc16 /src/main/scala/scala/async/internal/AsyncTransform.scala
parent480fffd487d53cfdb943a2287788af2bad409b88 (diff)
downloadscala-async-62f22d41cfabc7d0d87c5afef64c1c9015e2cf5e.tar.gz
scala-async-62f22d41cfabc7d0d87c5afef64c1c9015e2cf5e.tar.bz2
scala-async-62f22d41cfabc7d0d87c5afef64c1c9015e2cf5e.zip
Enables testing the resetting of lifted local variables
- Adds a hook that lets a derived macro insert additional code when zero-ing out a lifted field. - Adds a variant of the `AsyncId` macro that logs zeroed-out fields. - Adds a test using this mechanism
Diffstat (limited to 'src/main/scala/scala/async/internal/AsyncTransform.scala')
-rw-r--r--src/main/scala/scala/async/internal/AsyncTransform.scala10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/main/scala/scala/async/internal/AsyncTransform.scala b/src/main/scala/scala/async/internal/AsyncTransform.scala
index 5c84f66..18caea4 100644
--- a/src/main/scala/scala/async/internal/AsyncTransform.scala
+++ b/src/main/scala/scala/async/internal/AsyncTransform.scala
@@ -5,6 +5,8 @@ trait AsyncTransform {
import global._
+ val asyncBase: AsyncBase
+
def asyncTransform[T](body: Tree, execContext: Tree, cpsFallbackEnabled: Boolean)
(resultType: WeakTypeTag[T]): Tree = {
@@ -68,7 +70,13 @@ trait AsyncTransform {
for ((state, flds) <- assignsOf) {
val assigns = flds.map { fld =>
val fieldSym = fld.symbol
- Assign(gen.mkAttributedStableRef(fieldSym.owner.thisType, fieldSym), gen.mkZero(fieldSym.info))
+ val zero = gen.mkZero(fieldSym.info)
+ Block(
+ List(
+ asyncBase.nullOut(global)(Expr[String](Literal(Constant(fieldSym.name.toString))), Expr[Any](zero)).tree
+ ),
+ Assign(gen.mkAttributedStableRef(fieldSym.owner.thisType, fieldSym), zero)
+ )
}
val asyncState = asyncBlock.asyncStates.find(_.state == state).get
asyncState.stats = assigns ++ asyncState.stats