summaryrefslogtreecommitdiff
path: root/src/library
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@epfl.ch>2012-03-02 17:58:08 +0100
committerAdriaan Moors <adriaan.moors@epfl.ch>2012-03-09 09:09:42 +0100
commit0cffdf38d9e2d88e66d8649d317f8815716b2748 (patch)
tree70f4c85a0aadaeed8d15eeb8d28be1157cd72456 /src/library
parentb9082321219f78a86e80fcea2a71d96ee4beb397 (diff)
downloadscala-0cffdf38d9e2d88e66d8649d317f8815716b2748.tar.gz
scala-0cffdf38d9e2d88e66d8649d317f8815716b2748.tar.bz2
scala-0cffdf38d9e2d88e66d8649d317f8815716b2748.zip
SI-5189 1/2: inferConstrInst uses correct variance
fixed concurrent.impl.Promise by making FState invariant (it would be unsound to make it covariant)
Diffstat (limited to 'src/library')
-rw-r--r--src/library/scala/concurrent/impl/Promise.scala10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/library/scala/concurrent/impl/Promise.scala b/src/library/scala/concurrent/impl/Promise.scala
index 585f71f3cf..0087b71ea8 100644
--- a/src/library/scala/concurrent/impl/Promise.scala
+++ b/src/library/scala/concurrent/impl/Promise.scala
@@ -80,8 +80,10 @@ object Promise {
def EmptyPending[T](): FState[T] = emptyPendingValue.asInstanceOf[FState[T]]
/** Represents the internal state.
+ *
+ * [adriaan] it's unsound to make FState covariant (tryComplete won't type check)
*/
- sealed trait FState[+T] { def value: Option[Try[T]] }
+ sealed trait FState[T] { def value: Option[Try[T]] }
case class Pending[T](listeners: List[Try[T] => Any] = Nil) extends FState[T] {
def value: Option[Try[T]] = None
@@ -155,7 +157,11 @@ object Promise {
def tryComplete(v: Try[T]): List[Try[T] => Any] = {
getState match {
case cur @ Pending(listeners) =>
- if (updateState(cur, if (v.isFailure) Failure(Some(v.asInstanceOf[util.Failure[T]])) else Success(Some(v.asInstanceOf[util.Success[T]])))) listeners
+ val newState =
+ if (v.isFailure) Failure(Some(v.asInstanceOf[util.Failure[T]]))
+ else Success(Some(v.asInstanceOf[util.Success[T]]))
+
+ if (updateState(cur, newState)) listeners
else tryComplete(v)
case _ => null
}