From b4c62d5fedf155cbab57cfeead97eccc94345c71 Mon Sep 17 00:00:00 2001 From: Andreas Rumpf Date: Sun, 3 Jan 2016 23:20:53 +0100 Subject: [PATCH] async works again --- compiler/lambdalifting.nim | 48 +++++++++++--------- tests/closure/tclosure0.nim | 87 ++++++++++++++++++++++++++++++++++++ tests/iter/tclosureiters.nim | 73 ++++++++++++++++++++++++++++++ 3 files changed, 188 insertions(+), 20 deletions(-) create mode 100644 tests/closure/tclosure0.nim create mode 100644 tests/iter/tclosureiters.nim diff --git a/compiler/lambdalifting.nim b/compiler/lambdalifting.nim index 378f3a187d..8150e30c84 100644 --- a/compiler/lambdalifting.nim +++ b/compiler/lambdalifting.nim @@ -451,15 +451,19 @@ proc newEnvVar(owner: PSym; typ: PType): PNode = var v = newSym(skVar, getIdent(envName), owner, owner.info) incl(v.flags, sfShadowed) v.typ = typ - if owner.kind == skIterator and owner.typ.callConv == ccClosure: - let it = getHiddenParam(owner) - addUniqueField(it.typ.sons[0], v) - result = indirectAccess(newSymNode(it), v, v.info) - else: - result = newSymNode(v) + result = newSymNode(v) + when false: + if owner.kind == skIterator and owner.typ.callConv == ccClosure: + let it = getHiddenParam(owner) + addUniqueField(it.typ.sons[0], v) + result = indirectAccess(newSymNode(it), v, v.info) + else: + result = newSymNode(v) proc setupEnvVar(owner: PSym; d: DetectionPass; c: var LiftingPass): PNode = + if owner.isIterator: + return getHiddenParam(owner).newSymNode result = c.envvars.getOrDefault(owner.id) if result.isNil: let envVarType = d.ownerToType.getOrDefault(owner.id) @@ -482,20 +486,24 @@ proc rawClosureCreation(owner: PSym; d: DetectionPass; c: var LiftingPass): PNode = result = newNodeI(nkStmtList, owner.info) - let env = setupEnvVar(owner, d, c) - if env.kind == nkSym: - var v = newNodeI(nkVarSection, env.info) - addVar(v, env) - result.add(v) - # add 'new' statement: - result.add(newCall(getSysSym"internalNew", env)) - # add assignment statements for captured parameters: - for i in 1..= numToTake: + break + yield x + inc i + +# gives wrong reasult (3 times 0) +for x in infinite.take(3): + echo x + +# does what we want +let inf = infinite +for x in inf.take(3): + echo x