@@ -27,7 +27,7 @@ trait ExprBuilder {
2727
2828 def nextStates : List [Int ]
2929
30- def mkHandlerCaseForState : CaseDef
30+ def mkHandlerCaseForState [ T : WeakTypeTag ] : CaseDef
3131
3232 def mkOnCompleteHandler [T : WeakTypeTag ]: Option [CaseDef ] = None
3333
@@ -51,7 +51,7 @@ trait ExprBuilder {
5151 def nextStates : List [Int ] =
5252 List (nextState)
5353
54- def mkHandlerCaseForState : CaseDef =
54+ def mkHandlerCaseForState [ T : WeakTypeTag ] : CaseDef =
5555 mkHandlerCase(state, stats :+ mkStateTree(nextState, symLookup))
5656
5757 override val toString : String =
@@ -62,7 +62,7 @@ trait ExprBuilder {
6262 * a branch of an `if` or a `match`.
6363 */
6464 final class AsyncStateWithoutAwait (var stats : List [Tree ], val state : Int , val nextStates : List [Int ]) extends AsyncState {
65- override def mkHandlerCaseForState : CaseDef =
65+ override def mkHandlerCaseForState [ T : WeakTypeTag ] : CaseDef =
6666 mkHandlerCase(state, stats)
6767
6868 override val toString : String =
@@ -79,39 +79,47 @@ trait ExprBuilder {
7979 def nextStates : List [Int ] =
8080 List (nextState)
8181
82- override def mkHandlerCaseForState : CaseDef = {
83- val callOnComplete = futureSystemOps.onComplete(Expr (awaitable.expr),
84- Expr (This (tpnme.EMPTY )), Expr (Ident (name.execContext))).tree
85- mkHandlerCase(state, stats ++ List (mkStateTree(onCompleteState, symLookup), callOnComplete, Return (literalUnit)))
82+ override def mkHandlerCaseForState [T : WeakTypeTag ]: CaseDef = {
83+ val fun = This (tpnme.EMPTY )
84+ val callOnComplete = futureSystemOps.onComplete[Any , Unit ](Expr [futureSystem.Fut [Any ]](awaitable.expr),
85+ Expr [futureSystem.Tryy [Any ] => Unit ](fun), Expr [futureSystem.ExecContext ](Ident (name.execContext))).tree
86+ val tryGetOrCallOnComplete =
87+ if (futureSystemOps.continueCompletedFutureOnSameThread)
88+ If (futureSystemOps.isCompleted(Expr [futureSystem.Fut [_]](awaitable.expr)).tree,
89+ Block (ifIsFailureTree[T ](futureSystemOps.getCompleted[Any ](Expr [futureSystem.Fut [Any ]](awaitable.expr)).tree) :: Nil , literalUnit),
90+ Block (callOnComplete :: Nil , Return (literalUnit)))
91+ else
92+ Block (callOnComplete :: Nil , Return (literalUnit))
93+ mkHandlerCase(state, stats ++ List (mkStateTree(onCompleteState, symLookup), tryGetOrCallOnComplete))
8694 }
8795
96+ private def tryGetTree (tryReference : => Tree ) =
97+ Assign (
98+ Ident (awaitable.resultName),
99+ TypeApply (Select (futureSystemOps.tryyGet[Any ](Expr [futureSystem.Tryy [Any ]](tryReference)).tree, newTermName(" asInstanceOf" )), List (TypeTree (awaitable.resultType)))
100+ )
101+
102+ /* if (tr.isFailure)
103+ * result.complete(tr.asInstanceOf[Try[T]])
104+ * else {
105+ * <resultName> = tr.get.asInstanceOf[<resultType>]
106+ * <nextState>
107+ * <mkResumeApply>
108+ * }
109+ */
110+ def ifIsFailureTree [T : WeakTypeTag ](tryReference : => Tree ) =
111+ If (futureSystemOps.tryyIsFailure(Expr [futureSystem.Tryy [T ]](tryReference)).tree,
112+ Block (futureSystemOps.completeProm[T ](
113+ Expr [futureSystem.Prom [T ]](symLookup.memberRef(name.result)),
114+ Expr [futureSystem.Tryy [T ]](
115+ TypeApply (Select (tryReference, newTermName(" asInstanceOf" )),
116+ List (TypeTree (futureSystemOps.tryType[T ]))))).tree :: Nil ,
117+ Return (literalUnit)),
118+ Block (List (tryGetTree(tryReference)), mkStateTree(nextState, symLookup))
119+ )
120+
88121 override def mkOnCompleteHandler [T : WeakTypeTag ]: Option [CaseDef ] = {
89- val tryGetTree =
90- Assign (
91- Ident (awaitable.resultName),
92- TypeApply (Select (futureSystemOps.tryyGet[T ](Expr [futureSystem.Tryy [T ]](Ident (symLookup.applyTrParam))).tree, newTermName(" asInstanceOf" )), List (TypeTree (awaitable.resultType)))
93- )
94-
95- /* if (tr.isFailure)
96- * result.complete(tr.asInstanceOf[Try[T]])
97- * else {
98- * <resultName> = tr.get.asInstanceOf[<resultType>]
99- * <nextState>
100- * <mkResumeApply>
101- * }
102- */
103- val ifIsFailureTree =
104- If (futureSystemOps.tryyIsFailure(Expr [futureSystem.Tryy [T ]](Ident (symLookup.applyTrParam))).tree,
105- Block (futureSystemOps.completeProm[T ](
106- Expr [futureSystem.Prom [T ]](symLookup.memberRef(name.result)),
107- Expr [futureSystem.Tryy [T ]](
108- TypeApply (Select (Ident (symLookup.applyTrParam), newTermName(" asInstanceOf" )),
109- List (TypeTree (futureSystemOps.tryType[T ]))))).tree :: Nil ,
110- Return (literalUnit)),
111- Block (List (tryGetTree), mkStateTree(nextState, symLookup))
112- )
113-
114- Some (mkHandlerCase(onCompleteState, List (ifIsFailureTree)))
122+ Some (mkHandlerCase(onCompleteState, List (ifIsFailureTree[T ](Ident (symLookup.applyTrParam)))))
115123 }
116124
117125 override val toString : String =
@@ -337,7 +345,7 @@ trait ExprBuilder {
337345 case s :: Nil =>
338346 List (caseForLastState)
339347 case _ =>
340- val initCases = for (state <- asyncStates.toList.init) yield state.mkHandlerCaseForState
348+ val initCases = for (state <- asyncStates.toList.init) yield state.mkHandlerCaseForState[ T ]
341349 initCases :+ caseForLastState
342350 }
343351 }
0 commit comments