aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md14
-rw-r--r--src/main/scala/scala/async/internal/LiveVariables.scala2
-rw-r--r--src/main/scala/scala/async/internal/TransformUtils.scala5
-rw-r--r--src/test/scala/scala/async/run/live/LiveVariablesSpec.scala26
-rw-r--r--src/test/scala/scala/async/run/toughtype/ToughType.scala13
5 files changed, 45 insertions, 15 deletions
diff --git a/README.md b/README.md
index 62c6b4f..6e752ba 100644
--- a/README.md
+++ b/README.md
@@ -1,18 +1,8 @@
-# Scala Async Project
-
-[![Build Status](https://secure.travis-ci.org/scala/async.png)](http://travis-ci.org/scala/async)
-
+# scala-async [<img src="https://img.shields.io/travis/scala/async.svg"/>](https://travis-ci.org/scala/async) [<img src="https://img.shields.io/maven-central/v/org.scala-lang.modules/scala-async_2.10.svg?label=latest%20release%20for%202.10"/>](http://search.maven.org/#search%7Cga%7C1%7Cg%3Aorg.scala-lang.modules%20a%3Ascala-async_2.10) [<img src="https://img.shields.io/maven-central/v/org.scala-lang.modules/scala-async_2.11*.svg?label=latest%20release%20for%202.11"/>](http://search.maven.org/#search%7Cga%7C1%7Cg%3Aorg.scala-lang.modules%20a%3Ascala-async_2.11*)
## Quick start
-Add a dependency:
-
-```scala
-// SBT
-libraryDependencies += "org.scala-lang.modules" %% "scala-async" % "0.9.3"
-```
-
-Write your first `async` block:
+After adding a scala-async to your classpath, write your first `async` block:
```scala
import ExecutionContext.Implicits.global
diff --git a/src/main/scala/scala/async/internal/LiveVariables.scala b/src/main/scala/scala/async/internal/LiveVariables.scala
index 23063ba..79ba18e 100644
--- a/src/main/scala/scala/async/internal/LiveVariables.scala
+++ b/src/main/scala/scala/async/internal/LiveVariables.scala
@@ -56,7 +56,7 @@ trait LiveVariables {
// determine which fields should be live also at the end (will not be nulled out)
val noNull: Set[Symbol] = liftedSyms.filter { sym =>
- sym.tpe.typeSymbol.isPrimitiveValueClass || liftables.exists { tree =>
+ sym.tpe.typeSymbol.isPrimitiveValueClass || sym.tpe.typeSymbol == definitions.NothingClass || liftables.exists { tree =>
!liftedSyms.contains(tree.symbol) && tree.exists(_.symbol == sym)
}
}
diff --git a/src/main/scala/scala/async/internal/TransformUtils.scala b/src/main/scala/scala/async/internal/TransformUtils.scala
index 0b8cd00..da76c18 100644
--- a/src/main/scala/scala/async/internal/TransformUtils.scala
+++ b/src/main/scala/scala/async/internal/TransformUtils.scala
@@ -259,10 +259,11 @@ private[async] trait TransformUtils {
if (tp.typeSymbol.isDerivedValueClass) {
val argZero = mkZero(tp.memberType(tp.typeSymbol.derivedValueClassUnbox).resultType)
val target: Tree = gen.mkAttributedSelect(
- typer.typedPos(macroPos)(
+ callSiteTyper.typedPos(macroPos)(
New(TypeTree(tp.baseType(tp.typeSymbol)))), tp.typeSymbol.primaryConstructor)
val zero = gen.mkMethodCall(target, argZero :: Nil)
- gen.mkCast(zero, tp)
+ // restore the original type which we might otherwise have weakened with `baseType` above
+ callSiteTyper.typedPos(macroPos)(gen.mkCast(zero, tp))
} else {
gen.mkZero(tp)
}
diff --git a/src/test/scala/scala/async/run/live/LiveVariablesSpec.scala b/src/test/scala/scala/async/run/live/LiveVariablesSpec.scala
index 17d33af..09d01c1 100644
--- a/src/test/scala/scala/async/run/live/LiveVariablesSpec.scala
+++ b/src/test/scala/scala/async/run/live/LiveVariablesSpec.scala
@@ -263,4 +263,30 @@ class LiveVariablesSpec {
}
baz()
}
+
+ // https://github.com/scala/async/issues/104
+ @Test def dontNullOutVarsOfTypeNothing_t104(): Unit = {
+ implicit val ec: scala.concurrent.ExecutionContext = null
+ import scala.async.Async._
+ import scala.concurrent.duration.Duration
+ import scala.concurrent.{Await, Future}
+ import scala.concurrent.ExecutionContext.Implicits.global
+ def errorGenerator(randomNum: Double) = {
+ Future {
+ if (randomNum < 0) {
+ throw new IllegalStateException("Random number was too low!")
+ } else {
+ throw new IllegalStateException("Random number was too high!")
+ }
+ }
+ }
+ def randomTimesTwo = async {
+ val num = _root_.scala.math.random
+ if (num < 0 || num > 1) {
+ await(errorGenerator(num))
+ }
+ num * 2
+ }
+ Await.result(randomTimesTwo, TestLatch.DefaultTimeout) // was: NotImplementedError
+ }
}
diff --git a/src/test/scala/scala/async/run/toughtype/ToughType.scala b/src/test/scala/scala/async/run/toughtype/ToughType.scala
index 0f56ae0..ec59399 100644
--- a/src/test/scala/scala/async/run/toughtype/ToughType.scala
+++ b/src/test/scala/scala/async/run/toughtype/ToughType.scala
@@ -286,6 +286,19 @@ class ToughTypeSpec {
val result = Await.result(fut, 5.seconds)
result mustBe None
}
+
+ // https://github.com/scala/async/issues/106
+ @Test def valueClassT106(): Unit = {
+ import scala.async.internal.AsyncId._
+ async {
+ "whatever value" match {
+ case _ =>
+ await("whatever return type")
+ new IntWrapper("value class matters")
+ }
+ "whatever return type"
+ }
+ }
}
class IntWrapper(val value: String) extends AnyVal {