Skip to content

Commit 4472880

Browse files
committed
Support future systems that perform external failure handling
1 parent 67b1a60 commit 4472880

File tree

3 files changed

+20
-11
lines changed

3 files changed

+20
-11
lines changed

src/main/scala/scala/async/internal/ExprBuilder.scala

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -117,16 +117,22 @@ trait ExprBuilder {
117117
* <mkResumeApply>
118118
* }
119119
*/
120-
def ifIsFailureTree[T: WeakTypeTag](tryReference: => Tree) =
121-
If(futureSystemOps.tryyIsFailure(c.Expr[futureSystem.Tryy[T]](tryReference)).tree,
122-
Block(toList(futureSystemOps.completeProm[T](
123-
c.Expr[futureSystem.Prom[T]](symLookup.memberRef(name.result)),
124-
c.Expr[futureSystem.Tryy[T]](
125-
TypeApply(Select(tryReference, newTermName("asInstanceOf")),
126-
List(TypeTree(futureSystemOps.tryType[T]))))).tree),
127-
Return(literalUnit)),
128-
Block(List(tryGetTree(tryReference)), mkStateTree(nextState, symLookup))
129-
)
120+
def ifIsFailureTree[T: WeakTypeTag](tryReference: => Tree) = {
121+
val getAndUpdateState = Block(List(tryGetTree(tryReference)), mkStateTree(nextState, symLookup))
122+
if (asyncBase.futureSystem.emitTryCatch) {
123+
If(futureSystemOps.tryyIsFailure(c.Expr[futureSystem.Tryy[T]](tryReference)).tree,
124+
Block(toList(futureSystemOps.completeProm[T](
125+
c.Expr[futureSystem.Prom[T]](symLookup.memberRef(name.result)),
126+
c.Expr[futureSystem.Tryy[T]](
127+
TypeApply(Select(tryReference, newTermName("asInstanceOf")),
128+
List(TypeTree(futureSystemOps.tryType[T]))))).tree),
129+
Return(literalUnit)),
130+
getAndUpdateState
131+
)
132+
} else {
133+
getAndUpdateState
134+
}
135+
}
130136

131137
override def mkOnCompleteHandler[T: WeakTypeTag]: Option[CaseDef] = {
132138
Some(mkHandlerCase(onCompleteState, List(ifIsFailureTree[T](Ident(symLookup.applyTrParam)))))
@@ -402,7 +408,7 @@ trait ExprBuilder {
402408
val stateMemberRef = symLookup.memberRef(name.state)
403409
val body = Match(stateMemberRef, mkCombinedHandlerCases[T] ++ initStates.flatMap(_.mkOnCompleteHandler[T]) ++ List(CaseDef(Ident(nme.WILDCARD), EmptyTree, Throw(Apply(Select(New(Ident(defn.IllegalStateExceptionClass)), termNames.CONSTRUCTOR), List())))))
404410

405-
Try(
411+
maybeTry(
406412
body,
407413
List(
408414
CaseDef(

src/main/scala/scala/async/internal/FutureSystem.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ trait FutureSystem {
7676
def mkOps(c0: Context): Ops { val c: c0.type }
7777

7878
def freshenAllNames: Boolean = false
79+
def emitTryCatch: Boolean = true
7980
}
8081

8182
object ScalaConcurrentFutureSystem extends FutureSystem {

src/main/scala/scala/async/internal/TransformUtils.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ private[async] trait TransformUtils {
5656
def fresh(name: String): String = c.freshName(name)
5757
}
5858

59+
def maybeTry(block: Tree, catches: List[CaseDef], finalizer: Tree) = if (asyncBase.futureSystem.emitTryCatch) Try(block, catches, finalizer) else block
60+
5961
def isAsync(fun: Tree) =
6062
fun.symbol == defn.Async_async
6163

0 commit comments

Comments
 (0)