diff options
-rw-r--r-- | README.md | 14 | ||||
-rw-r--r-- | src/main/scala/scala/async/internal/LiveVariables.scala | 2 | ||||
-rw-r--r-- | src/main/scala/scala/async/internal/TransformUtils.scala | 5 | ||||
-rw-r--r-- | src/test/scala/scala/async/run/live/LiveVariablesSpec.scala | 26 | ||||
-rw-r--r-- | src/test/scala/scala/async/run/toughtype/ToughType.scala | 13 |
5 files changed, 45 insertions, 15 deletions
@@ -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 { |