simple closure iterator calling closure iterator works; refs #3837

This commit is contained in:
Andreas Rumpf
2016-12-27 09:51:58 +01:00
parent e1828733f1
commit 39b25cf4dc
2 changed files with 29 additions and 9 deletions

View File

@@ -240,16 +240,22 @@ proc liftIterSym*(n: PNode; owner: PSym): PNode =
result = newNodeIT(nkStmtListExpr, n.info, n.typ)
let hp = getHiddenParam(iter)
let env = newSym(skLet, iter.name, owner, n.info)
env.typ = hp.typ
env.flags = hp.flags
var v = newNodeI(nkVarSection, n.info)
addVar(v, newSymNode(env))
result.add(v)
var env: PNode
if owner.isIterator:
let it = getHiddenParam(owner)
addUniqueField(it.typ.sons[0], hp)
env = indirectAccess(newSymNode(it), hp, hp.info)
else:
let e = newSym(skLet, iter.name, owner, n.info)
e.typ = hp.typ
e.flags = hp.flags
env = newSymNode(e)
var v = newNodeI(nkVarSection, n.info)
addVar(v, env)
result.add(v)
# add 'new' statement:
let envAsNode = env.newSymNode
result.add newCall(getSysSym"internalNew", envAsNode)
result.add makeClosure(iter, envAsNode, n.info)
result.add newCall(getSysSym"internalNew", env)
result.add makeClosure(iter, env, n.info)
proc freshVarForClosureIter*(s, owner: PSym): PNode =
let envParam = getHiddenParam(owner)

View File

@@ -0,0 +1,14 @@
discard """
output: '''1'''
"""
# bug #3837
iterator t1(): int {.closure.} =
yield 1
iterator t2(): int {.closure.} =
for i in t1():
yield i
for i in t2():
echo $i