Skip to content

Commit d99c78e

Browse files
committed
Fixed forward-return case
1 parent f8fd8b8 commit d99c78e

File tree

5 files changed

+36
-141
lines changed

5 files changed

+36
-141
lines changed

src/back/CodeGen/Expr.hs

+33-10
Original file line numberDiff line numberDiff line change
@@ -1116,17 +1116,40 @@ instance Translatable A.Expr (State Ctx.Context (CCode Lval, CCode Stat)) where
11161116
translate ret@(A.Return{A.val}) =
11171117
do (nval, tval) <- translate val
11181118
eCtx <- gets Ctx.getExecCtx
1119+
isAsyncForward <- gets Ctx.isAsyncForward
11191120
let theReturn =
1120-
case eCtx of
1121-
Ctx.FunctionContext fun ->
1122-
[dtraceFunctionExit (A.functionName fun), Return nval]
1123-
Ctx.MethodContext mdecl ->
1124-
[dtraceMethodExit thisVar (A.methodName mdecl), Return nval]
1125-
Ctx.ClosureContext clos ->
1126-
let ty = (Ty.getResultType $ A.getType clos)
1127-
in [dtraceClosureExit,
1128-
Return $ asEncoreArgT (translate ty) nval]
1129-
_ -> error "Expr.hs: No context to return from"
1121+
if isAsyncForward then
1122+
case eCtx of
1123+
Ctx.FunctionContext fun ->
1124+
let ty = A.getType fun
1125+
in [dtraceFunctionExit (A.functionName fun)
1126+
,Statement $ Call futureFulfil [AsExpr encoreCtxVar, AsExpr futVar
1127+
,asEncoreArgT (translate ty) nval]
1128+
,Return Skip]
1129+
Ctx.MethodContext mdecl ->
1130+
let ty = A.getType mdecl
1131+
in [dtraceMethodExit thisVar (A.methodName mdecl)
1132+
,Statement $ Call futureFulfil [AsExpr encoreCtxVar, AsExpr futVar
1133+
,asEncoreArgT (translate ty) nval]
1134+
,Return Skip]
1135+
Ctx.ClosureContext clos ->
1136+
let ty = (Ty.getResultType $ A.getType clos)
1137+
in [dtraceClosureExit
1138+
,Statement $ Call futureFulfil [AsExpr encoreCtxVar, AsExpr futVar
1139+
,asEncoreArgT (translate ty) nval]
1140+
,Return Skip]
1141+
_ -> error "Expr.hs: No context to return from"
1142+
else
1143+
case eCtx of
1144+
Ctx.FunctionContext fun ->
1145+
[dtraceFunctionExit (A.functionName fun), Return nval]
1146+
Ctx.MethodContext mdecl ->
1147+
[dtraceMethodExit thisVar (A.methodName mdecl), Return nval]
1148+
Ctx.ClosureContext clos ->
1149+
let ty = (Ty.getResultType $ A.getType clos)
1150+
in [dtraceClosureExit,
1151+
Return $ asEncoreArgT (translate ty) nval]
1152+
_ -> error "Expr.hs: No context to return from"
11301153
return (unit, Seq $ tval:theReturn)
11311154

11321155
translate iseos@(A.IsEos{A.target}) =

src/tests/encore/forward/failedPolyTypeStreamWithObject.enc

-58
This file was deleted.

src/tests/encore/forward/forwardReturn.enc

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ active class Main
33
if b then
44
forward (this ! foo(b))
55
else
6-
return this.foo(b)
6+
return 42
77
end
88
end
99
def main() : unit
10-
this.foo(false)
10+
println(this.foo(false))
1111
end
1212
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
42

src/tests/encore/forward/test0613.enc

-71
This file was deleted.

0 commit comments

Comments
 (0)