mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
simple closure iterator calling closure iterator works; refs #3837
This commit is contained in:
@@ -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)
|
||||
|
||||
14
tests/iter/t2closureiters.nim
Normal file
14
tests/iter/t2closureiters.nim
Normal 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
|
||||
Reference in New Issue
Block a user