@@ -221,7 +221,7 @@ instance Translatable A.Expr (State Ctx.Context (CCode Lval, CCode Stat)) where
221
221
let string = head args
222
222
rest = tail args
223
223
unless (Ty. isStringType $ A. getType string) $
224
- error " Expr.hs: Print expects first argument to be a string literal"
224
+ error $ " Expr.hs: Print expects first argument to be a string literal"
225
225
targs <- mapM translate rest
226
226
let argNames = map (AsExpr . fst ) targs
227
227
argDecls = map snd targs
@@ -1036,7 +1036,8 @@ instance Translatable A.Expr (State Ctx.Context (CCode Lval, CCode Stat)) where
1036
1036
If futVar
1037
1037
(Seq $ initArgs ++ [Statement forwardingCall])
1038
1038
(Seq $ initArgs1 ++ [Statement oneWayMsg])] ++
1039
- result)
1039
+ result
1040
+ )
1040
1041
else do
1041
1042
(sendn, sendt) <- translate A. MessageSend {A. emeta
1042
1043
,A. target
@@ -1063,18 +1064,19 @@ instance Translatable A.Expr (State Ctx.Context (CCode Lval, CCode Stat)) where
1063
1064
isAsyncForward <- gets Ctx. isAsyncForward
1064
1065
let ty = getRuntimeType chain
1065
1066
dtraceExit = getDtraceExit eCtx
1066
- result =
1067
- case eCtx of
1068
- Ctx. ClosureContext clos -> []
1069
- _ -> [dtraceExit, Return Skip ]
1067
+ result = case eCtx of
1068
+ Ctx. ClosureContext clos -> []
1069
+ _ -> [dtraceExit, Return Skip ]
1070
1070
futureChain =
1071
1071
if Util. isForwardInExpr chain
1072
- then
1073
- Call futureChainActor
1074
- [AsExpr encoreCtxVar, AsExpr nfuture, ty, AsExpr nchain]
1075
- else
1076
- Call futureChainWithFut
1077
- [AsExpr encoreCtxVar, AsExpr nfuture, ty, AsExpr nchain, AsExpr futVar]
1072
+ then Call futureChainActor
1073
+ [AsExpr encoreCtxVar, AsExpr nfuture, ty, AsExpr nchain]
1074
+ else Call futureChainWithFut
1075
+ [AsExpr encoreCtxVar, AsExpr nfuture, ty, AsExpr nchain
1076
+ ,AsExpr futVar, AsExpr $ AsLval $ Nam " false" ]
1077
+ when (A. isVarAccess chain) $
1078
+ unless (A. isIdClosure chain) $
1079
+ error $ " Expr.hs: The closure that contains forward must be defined in chain."
1078
1080
if isAsyncForward
1079
1081
then do
1080
1082
return (unit, Seq $
@@ -1150,15 +1152,21 @@ instance Translatable A.Expr (State Ctx.Context (CCode Lval, CCode Stat)) where
1150
1152
(nfuture,tfuture) <- translate future
1151
1153
(nchain, tchain) <- translate chain
1152
1154
result <- Ctx. genSym
1155
+ isAsyncForward <- gets Ctx. isAsyncForward
1153
1156
let ty = getRuntimeType chain
1154
1157
return $ (Var result,
1155
1158
Seq $ [tfuture,
1156
1159
tchain,
1157
- (Assign (Decl (C. future, Var result))
1158
- (Call futureChainActor
1159
- [AsExpr encoreCtxVar, AsExpr nfuture, ty, AsExpr nchain]
1160
- ))] ++
1161
- if (Util. isForwardInExpr chain) then [assignVar futNam (Nam result)]
1160
+ if (Util. isForwardInExpr chain && isAsyncForward)
1161
+ then Statement $
1162
+ (Call futureChainWithFut
1163
+ [AsExpr encoreCtxVar, AsExpr nfuture, ty, AsExpr nchain,
1164
+ AsExpr ((Deref envName) `Dot ` futNam), AsExpr $ AsLval $ Nam " true" ])
1165
+ else Assign (Decl (C. future, Var result))
1166
+ (Call futureChainActor [AsExpr encoreCtxVar, AsExpr nfuture, ty, AsExpr nchain])
1167
+ ] ++
1168
+ if (Util. isForwardInExpr chain && isAsyncForward)
1169
+ then [assignVar futNam (Decl (C. future, Var result))]
1162
1170
else [] )
1163
1171
where
1164
1172
metaId = Meta. getMetaId . A. getMeta $ chain
@@ -1167,31 +1175,38 @@ instance Translatable A.Expr (State Ctx.Context (CCode Lval, CCode Stat)) where
1167
1175
1168
1176
translate clos@ (A. Closure {A. eparams, A. body}) = do
1169
1177
tmp <- Ctx. genSym
1170
- fut <- Ctx. genNamedSym " fut "
1178
+ futClos <- Ctx. genNamedSym " fut_closure "
1171
1179
globalFunctionNames <- gets Ctx. getGlobalFunctionNames
1172
1180
isAsyncForward <- gets Ctx. isAsyncForward
1173
1181
let bound = map (ID. qLocal . A. pname) eparams
1174
1182
freeVars = filter (ID. isLocalQName . fst ) $
1175
1183
Util. freeVariables bound body
1176
1184
ty = runtimeType . A. getType $ body
1177
- futArg = if isAsyncForward
1178
- then futVar
1179
- else (Var fut)
1180
1185
fillEnv <- insertAllVars freeVars fTypeVars
1181
1186
return
1182
1187
(Var tmp,
1183
- Seq $
1184
- mkEnv envName : fillEnv ++
1185
- (if isAsyncForward || (not $ Util. isForwardInExpr body)
1186
- then []
1187
- else [Assign (Decl (future, Var fut))
1188
- (Call futureMkFn [AsExpr encoreCtxVar, ty])]) ++
1189
- (if Util. isForwardInExpr body
1190
- then [assignVar futNam futArg]
1191
- else [] ) ++
1192
- [Assign (Decl (closure, Var tmp))
1193
- (Call closureMkFn [encoreCtxName, funName, envName, traceName, nullName])])
1188
+ Seq $
1189
+ mkEnv envName : fillEnv ++
1190
+ if isAsyncForward then
1191
+ if forwardInBody
1192
+ then [Assign (Decl (future, Var futClos))
1193
+ (Call futureMkFn [AsExpr encoreCtxVar, ty])
1194
+ ,assignVar futNam (Var futClos)
1195
+ ,Assign (Decl (closure, Var tmp))
1196
+ (Call closureMkFn [encoreCtxName, funNameAsync, envName, traceNameAsync, nullName])]
1197
+ else [Assign (Decl (closure, Var tmp))
1198
+ (Call closureMkFn [encoreCtxName, funName, envName, traceName, nullName])]
1199
+ else
1200
+ [Assign (Decl (closure, Var tmp))
1201
+ (Call closureMkFn [encoreCtxName, funName, envName, traceName, nullName])])
1194
1202
where
1203
+ forwardInBody = Util. isForwardInExpr body
1204
+ metaIdAsync = metaId ++ " _async"
1205
+ idClos = A. isIdClosure body
1206
+ funNameAsync = if idClos || not forwardInBody then funName
1207
+ else closureFunName metaIdAsync
1208
+ traceNameAsync = if idClos || not forwardInBody then traceName
1209
+ else closureTraceName metaIdAsync
1195
1210
metaId = Meta. getMetaId . A. getMeta $ clos
1196
1211
funName = closureFunName metaId
1197
1212
envName = closureEnvName metaId
0 commit comments