diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2016-01-11 11:11:44 +0100 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2016-01-11 11:11:44 +0100 |
commit | 5be6c95d217c1d86ad4288ea58b0c4c6ee3ffe90 (patch) | |
tree | 2b2346aaec130d04d7e065f873b870cf373f40df | |
parent | 0844941b35d22093861a42cb4d3070a1f54f7896 (diff) | |
download | Nim-5be6c95d217c1d86ad4288ea58b0c4c6ee3ffe90.tar.gz |
fixes async regression
-rw-r--r-- | compiler/lambdalifting.nim | 7 | ||||
-rw-r--r-- | tests/async/tnimcall_to_closure.nim | 17 |
2 files changed, 22 insertions, 2 deletions
diff --git a/compiler/lambdalifting.nim b/compiler/lambdalifting.nim index f1fdcf446..f75be0ed1 100644 --- a/compiler/lambdalifting.nim +++ b/compiler/lambdalifting.nim @@ -408,7 +408,7 @@ proc detectCapturedVars(n: PNode; owner: PSym; c: var DetectionPass) = addClosureParam(c, w) # , ow createUpField(c, w, up) w = up - of nkEmpty..pred(nkSym), succ(nkSym)..nkNilLit, nkClosure, + of nkEmpty..pred(nkSym), succ(nkSym)..nkNilLit, nkTemplateDef, nkTypeSection: discard of nkProcDef, nkMethodDef, nkConverterDef, nkMacroDef: @@ -687,11 +687,14 @@ proc liftCapturedVars(n: PNode; owner: PSym; d: DetectionPass; result = accessViaEnvParam(n, owner) else: result = accessViaEnvVar(n, owner, d, c) - of nkEmpty..pred(nkSym), succ(nkSym)..nkNilLit, nkClosure, + of nkEmpty..pred(nkSym), succ(nkSym)..nkNilLit, nkTemplateDef, nkTypeSection: discard of nkProcDef, nkMethodDef, nkConverterDef, nkMacroDef: discard + of nkClosure: + if n[1].kind == nkNilLit: + n.sons[0] = liftCapturedVars(n[0], owner, d, c) of nkLambdaKinds, nkIteratorDef: if n.typ != nil and n[namePos].kind == nkSym: let m = newSymNode(n[namePos].sym) diff --git a/tests/async/tnimcall_to_closure.nim b/tests/async/tnimcall_to_closure.nim new file mode 100644 index 000000000..748b67cb1 --- /dev/null +++ b/tests/async/tnimcall_to_closure.nim @@ -0,0 +1,17 @@ + +import asyncdispatch + +proc defaultOnProgressChanged() = discard + +proc ask(x: proc()) = x() + +proc retrFile*(onProgressChanged: proc() {.nimcall.}): Future[void] = + var retFuture = newFuture[void]("retrFile") + iterator retrFileIter(): FutureBase {.closure.} = + ask(onProgressChanged) + complete(retFuture) + + var nameIterVar = retrFileIter + return retFuture + +discard retrFile(defaultOnProgressChanged) |