diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2015-09-23 22:12:49 +1000 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2015-09-23 22:15:04 +1000 |
commit | 168e10cd8b60789aa3c9c96aeb5d5522c3ec6922 (patch) | |
tree | f3e876db8c7b7b4d5d7311dc7e9b3742057cf233 /src/main/scala/scala/async/internal/AnfTransform.scala | |
parent | e3ff0382ae4e015fc69da8335450718951714982 (diff) | |
download | scala-async-168e10cd8b60789aa3c9c96aeb5d5522c3ec6922.tar.gz scala-async-168e10cd8b60789aa3c9c96aeb5d5522c3ec6922.tar.bz2 scala-async-168e10cd8b60789aa3c9c96aeb5d5522c3ec6922.zip |
Small cleanups after code review
- More internal docs
- Be more frugal with the `NoAwait` attachment, for some AST node
types this is implied.
- Just use `x`, rather than what was effectively
`x.reverseMap(identity).reverse`
Diffstat (limited to 'src/main/scala/scala/async/internal/AnfTransform.scala')
-rw-r--r-- | src/main/scala/scala/async/internal/AnfTransform.scala | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/main/scala/scala/async/internal/AnfTransform.scala b/src/main/scala/scala/async/internal/AnfTransform.scala index cc77ec7..4545ca6 100644 --- a/src/main/scala/scala/async/internal/AnfTransform.scala +++ b/src/main/scala/scala/async/internal/AnfTransform.scala @@ -220,7 +220,7 @@ private[async] trait AnfTransform { case Block(stats, expr) => val trees = stats.flatMap(linearize.transformToList).filterNot(isLiteralUnit) ::: linearize.transformToList(expr) - eliminateLabelParameters(trees) + eliminateMatchEndLabelParameter(trees) case ValDef(mods, name, tpt, rhs) => if (containsAwait(rhs)) { @@ -273,7 +273,15 @@ private[async] trait AnfTransform { } // Replace the label parameters on `matchEnd` with use of a `matchRes` temporary variable - def eliminateLabelParameters(statsExpr: List[Tree]): List[Tree] = { + // + // CaseDefs are translated to labels without parmeters. A terminal label, `matchEnd`, accepts + // a parameter which is the result of the match (this is regular, so even Unit-typed matches have this). + // + // For our purposes, it is easier to: + // - extract a `matchRes` variable + // - rewrite the terminal label def to take no parameters, and instead read this temp variable + // - change jumps to the terminal label to an assignment and a no-arg label application + def eliminateMatchEndLabelParameter(statsExpr: List[Tree]): List[Tree] = { import internal.{methodType, setInfo} val caseDefToMatchResult = collection.mutable.Map[Symbol, Symbol]() @@ -304,7 +312,7 @@ private[async] trait AnfTransform { ) } matchResults.toList match { - case Nil => statsExpr0.reverse + case Nil => statsExpr case r1 :: Nil => (r1 +: statsExpr0.reverse) :+ atPos(tree.pos)(gen.mkAttributedIdent(r1.symbol)) case _ => c.error(macroPos, "Internal error: unexpected tree encountered during ANF transform " + statsExpr); statsExpr } |