Skip to content

NullPointerException when using a nested await() with an AnyVal class #86

Closed
@liff

Description

@liff

Running this code:

import scala.concurrent.{Await, Future}
import scala.concurrent.duration.Duration.Inf
import scala.concurrent.ExecutionContext.Implicits.global
import scala.async.Async.{async, await}


object Main {
  def main(args: Array[String]): Unit = {
    val f = async {
      val a = Future.successful(new A(BigInt(42)))
      await(await(a).g)
    }
    Await.result(f, Inf)
  }
}

class A(val b: BigInt) extends AnyVal {
  def g = Future.successful(b + 1)
}

results in an NPE:

java.lang.NullPointerException
    at Main$stateMachine$macro$1$1.resume(Main.scala:9)
    at Main$stateMachine$macro$1$1.apply(Main.scala:9)
    at Main$stateMachine$macro$1$1.apply(Main.scala:9)
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
    at scala.concurrent.impl.ExecutionContextImpl$AdaptedForkJoinTask.exec(ExecutionContextImpl.scala:121)
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.pollAndExecAll(ForkJoinPool.java:1253)
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1346)
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

If extends AnyVal is removed from A, it runs successfully. It also works if the enclosed type is an Int instead of a BigInt.

Scala version: 2.11.2
scala-async version: 0.9.2

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions