From 321ae07e65f062741f6d854f868dbe4c72cdafb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=99=8E=E9=B8=A3?= Date: Fri, 3 Jan 2025 03:47:36 +0800 Subject: [PATCH 1/3] perf: avoid double checking `value0` Future. --- project/MimaFilters.scala | 13 +++++++++---- src/library/scala/concurrent/package.scala | 11 +++++++++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/project/MimaFilters.scala b/project/MimaFilters.scala index e7351aa1b6d5..caf812cfbf1a 100644 --- a/project/MimaFilters.scala +++ b/project/MimaFilters.scala @@ -10,6 +10,7 @@ object MimaFilters extends AutoPlugin { object autoImport { val mimaReferenceVersion = settingKey[Option[String]]("Scala version number to run MiMa against") } + import autoImport._ override val globalSettings = Seq( @@ -43,6 +44,10 @@ object MimaFilters extends AutoPlugin { ProblemFilters.exclude[MissingClassProblem]("scala.collection.generic.CommonErrors"), ProblemFilters.exclude[MissingClassProblem]("scala.collection.generic.CommonErrors$"), + //ADD: Await#CompletedFuture is not a public API + ProblemFilters.exclude[MissingClassProblem]("scala.concurrent.Await$CompletedFuture$"), + ProblemFilters.exclude[MissingClassProblem]("scala.collection.generic.CommonErrors$"), + // scala/scala#10937 ProblemFilters.exclude[IncompatibleResultTypeProblem]("scala.collection.immutable.LazyList#LazyBuilder#DeferredState.eval"), ProblemFilters.exclude[MissingClassProblem](s"scala.collection.immutable.LazyList$$State"), @@ -82,9 +87,9 @@ object MimaFilters extends AutoPlugin { ) val mimaSettings: Seq[Setting[_]] = Def.settings( - mimaPreviousArtifacts := mimaReferenceVersion.value.map(organization.value % name.value % _).toSet, - mimaCheckDirection := "both", - mimaBinaryIssueFilters ++= mimaFilters, -// mimaReportSignatureProblems := true, // TODO: enable + mimaPreviousArtifacts := mimaReferenceVersion.value.map(organization.value % name.value % _).toSet, + mimaCheckDirection := "both", + mimaBinaryIssueFilters ++= mimaFilters, + // mimaReportSignatureProblems := true, // TODO: enable ) } diff --git a/src/library/scala/concurrent/package.scala b/src/library/scala/concurrent/package.scala index d648a1c90a15..d7e0389cb345 100644 --- a/src/library/scala/concurrent/package.scala +++ b/src/library/scala/concurrent/package.scala @@ -125,6 +125,9 @@ package object concurrent { } package concurrent { + + import scala.util.Try + /** * This marker trait is used by [[Await]] to ensure that [[Awaitable.ready]] and [[Awaitable.result]] * are not directly called by user code. An implicit instance of this trait is only available when @@ -170,7 +173,7 @@ package concurrent { @throws(classOf[TimeoutException]) @throws(classOf[InterruptedException]) final def ready[T](awaitable: Awaitable[T], atMost: Duration): awaitable.type = awaitable match { - case f: Future[T] if f.isCompleted => awaitable.ready(atMost)(AwaitPermission) + case f: Future[T] if f.isCompleted => awaitable case _ => blocking(awaitable.ready(atMost)(AwaitPermission)) } @@ -197,8 +200,12 @@ package concurrent { @throws(classOf[TimeoutException]) @throws(classOf[InterruptedException]) final def result[T](awaitable: Awaitable[T], atMost: Duration): T = awaitable match { - case f: Future[T] if f.isCompleted => f.result(atMost)(AwaitPermission) + case CompletedFuture(result: Try[T] @unchecked) => result.get case _ => blocking(awaitable.result(atMost)(AwaitPermission)) } + + private[this] object CompletedFuture { + def unapply[T](f: Future[T]): Option[Try[T]] = f.value + } } } From 0ca9173a85d108bb3b221932bc9d497602c5d5bf Mon Sep 17 00:00:00 2001 From: "He-Pin(kerr)" Date: Fri, 5 Sep 2025 23:36:42 +0800 Subject: [PATCH 2/3] Update src/library/scala/concurrent/package.scala MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sébastien Doeraene --- src/library/scala/concurrent/package.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/library/scala/concurrent/package.scala b/src/library/scala/concurrent/package.scala index d7e0389cb345..b73bee08452c 100644 --- a/src/library/scala/concurrent/package.scala +++ b/src/library/scala/concurrent/package.scala @@ -200,7 +200,7 @@ package concurrent { @throws(classOf[TimeoutException]) @throws(classOf[InterruptedException]) final def result[T](awaitable: Awaitable[T], atMost: Duration): T = awaitable match { - case CompletedFuture(result: Try[T] @unchecked) => result.get + case CompletedFuture(result) => result.get case _ => blocking(awaitable.result(atMost)(AwaitPermission)) } From a86956dd9129a7173c5d4600ed1ed95697adf833 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=99=8E=E9=B8=A3?= Date: Sat, 6 Sep 2025 00:38:26 +0800 Subject: [PATCH 3/3] x --- src/library/scala/concurrent/package.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/library/scala/concurrent/package.scala b/src/library/scala/concurrent/package.scala index b73bee08452c..3dbbc4508957 100644 --- a/src/library/scala/concurrent/package.scala +++ b/src/library/scala/concurrent/package.scala @@ -200,7 +200,7 @@ package concurrent { @throws(classOf[TimeoutException]) @throws(classOf[InterruptedException]) final def result[T](awaitable: Awaitable[T], atMost: Duration): T = awaitable match { - case CompletedFuture(result) => result.get + case CompletedFuture(result) => result.get.asInstanceOf[T] case _ => blocking(awaitable.result(atMost)(AwaitPermission)) }