bugfix: codegen for promises

This commit is contained in:
Araq 2014-06-02 09:13:16 +02:00
commit b78173788d
3 changed files with 13 additions and 5 deletions

View file

@ -205,7 +205,7 @@ proc createNimCreatePromiseCall(prom, threadParam: PNode): PNode =
let castExpr = newNodeIT(nkCast, prom.info, prom.typ)
castExpr.add emptyNode
castExpr.add callCodeGenProc("nimCreatePromise", threadParam, size)
result = newFastAsgnStmt(prom, castExpr)
result = castExpr
proc createWrapperProc(f: PNode; threadParam, argsParam: PSym;
varSection, call, barrier, prom: PNode;
@ -216,9 +216,14 @@ proc createWrapperProc(f: PNode; threadParam, argsParam: PSym;
var threadLocalProm: PSym
if spawnKind == srByVar:
threadLocalProm = addLocalVar(varSection, argsParam.owner, prom.typ, prom)
elif prom != nil:
internalAssert prom.typ.kind == tyGenericInst
threadLocalProm = addLocalVar(varSection, argsParam.owner, prom.typ,
createNimCreatePromiseCall(prom, threadParam.newSymNode))
body.add varSection
if prom != nil and spawnKind != srByVar:
body.add createNimCreatePromiseCall(prom, threadParam.newSymNode)
body.add newFastAsgnStmt(prom, threadLocalProm.newSymNode)
if barrier == nil:
body.add callCodeGenProc("nimPromiseCreateCondVar", prom)
@ -230,10 +235,12 @@ proc createWrapperProc(f: PNode; threadParam, argsParam: PSym;
if fk == promInvalid:
localError(f.info, "cannot create a promise of type: " &
typeToString(prom.typ.sons[1]))
body.add newAsgnStmt(indirectAccess(prom,
body.add newAsgnStmt(indirectAccess(threadLocalProm.newSymNode,
if fk == promGC: "data" else: "blob", prom.info), call)
if barrier == nil:
body.add callCodeGenProc("nimPromiseSignal", prom)
# by now 'prom' is shared and thus might have beeen overwritten! we need
# to use the thread-local view instead:
body.add callCodeGenProc("nimPromiseSignal", threadLocalProm.newSymNode)
else:
body.add call
if barrier != nil: