Skip to content

Commit 63072fe

Browse files
committed
Fix ownership corruption problem in the awaited expression
Previously, `whyDoYouHateMe` was incorrectly owned by `jerk`, rather than `pointlessSymbolOwner` after the ANF transform, which in turn led to: ``` java.util.NoSuchElementException: value whyDoHateMe at scala.collection.mutable.AnyRefMap$ExceptionDefault.apply(AnyRefMap.scala:425) at scala.collection.mutable.AnyRefMap$ExceptionDefault.apply(AnyRefMap.scala:424) at scala.collection.mutable.AnyRefMap.apply(AnyRefMap.scala:180) at scala.tools.nsc.backend.jvm.BCodeSkelBuilder$PlainSkelBuilder$locals$.load(BCodeSkelBuilder.scala:390) at scala.tools.nsc.backend.jvm.BCodeBodyBuilder$PlainBodyBuilder.genLoad(BCodeBodyBuilder.scala:354) ```
1 parent 4627fe0 commit 63072fe

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

src/main/scala/scala/async/internal/AnfTransform.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,9 +255,9 @@ private[async] trait AnfTransform {
255255

256256
case ValDef(mods, name, tpt, rhs) =>
257257
if (containsAwait(rhs)) {
258-
val stats :+ expr = api.atOwner(api.currentOwner.owner)(linearize.transformToList(rhs))
258+
val stats :+ expr = linearize.transformToList(rhs)
259259
stats.foreach(_.changeOwner(api.currentOwner, api.currentOwner.owner))
260-
stats :+ treeCopy.ValDef(tree, mods, name, tpt, expr)
260+
stats :+ treeCopy.ValDef(tree, mods, name, tpt, expr.changeOwner(api.currentOwner, api.currentOwner.owner))
261261
} else List(tree)
262262

263263
case Assign(lhs, rhs) =>

src/test/scala/scala/async/run/late/LateExpansion.scala

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,32 @@ class LateExpansion {
443443
""")
444444
}
445445

446+
@Test def testByNameOwner(): Unit = {
447+
val result = run(
448+
"""
449+
import scala.async.run.late.{autoawait,lateasync}
450+
object Bleh {
451+
@autoawait @lateasync def asyncCall(): Int = 0
452+
def byName[T](fn: => T): T = fn
453+
}
454+
object Boffo {
455+
@autoawait @lateasync def jerk(): Unit = {
456+
val pointlessSymbolOwner = 1 match {
457+
case _ =>
458+
Bleh.asyncCall()
459+
Bleh.byName {
460+
val whyDoHateMe = 1
461+
whyDoHateMe
462+
}
463+
}
464+
}
465+
}
466+
object Test {
467+
@lateasync def test() = Boffo.jerk()
468+
}
469+
""")
470+
}
471+
446472
private def createTempDir(): File = {
447473
val f = File.createTempFile("output", "")
448474
f.delete()
@@ -455,9 +481,9 @@ class LateExpansion {
455481
try {
456482
val reporter = new StoreReporter
457483
val settings = new Settings(println(_))
458-
//settings.processArgumentString("-Xprint:refchecks,patmat,postpatmat,jvm -nowarn")
459484
settings.outdir.value = out.getAbsolutePath
460485
settings.embeddedDefaults(getClass.getClassLoader)
486+
// settings.processArgumentString("-Xprint:patmat,postpatmat,jvm -nowarn")
461487
val isInSBT = !settings.classpath.isSetByUser
462488
if (isInSBT) settings.usejavacp.value = true
463489
val global = new Global(settings, reporter) {

0 commit comments

Comments
 (0)