This commit is contained in:
Araq
2015-02-01 02:27:19 +01:00
parent 3b45ac44e1
commit ecc3c3bd03
2 changed files with 19 additions and 3 deletions

View File

@@ -719,7 +719,7 @@ proc outerProcSons(o: POuterContext, n: PNode, it: TIter) =
let x = transformOuterProc(o, n.sons[i], it)
if x != nil: n.sons[i] = x
proc liftIterSym(n: PNode): PNode =
proc liftIterSym(n: PNode; owner: PSym): PNode =
# transforms (iter) to (let env = newClosure[iter](); (iter, env))
let iter = n.sym
assert iter.kind == skClosureIterator
@@ -727,7 +727,7 @@ proc liftIterSym(n: PNode): PNode =
result = newNodeIT(nkStmtListExpr, n.info, n.typ)
let hp = getHiddenParam(iter)
let env = newSym(skLet, iter.name, iter.owner, iter.info)
let env = newSym(skLet, iter.name, owner, n.info)
env.typ = hp.typ
env.flags = hp.flags
var v = newNodeI(nkVarSection, n.info)
@@ -867,7 +867,7 @@ proc transformOuterProc(o: POuterContext, n: PNode; it: TIter): PNode =
# XXX why doesn't this work?
var closure = PEnv(idTableGet(o.lambdasToEnv, local))
if closure.isNil:
return liftIterSym(n)
return liftIterSym(n, o.fn)
else:
let createdVar = generateIterClosureCreation(o, closure,
closure.attachedNode)

16
tests/iter/tobj_iter.nim Normal file
View File

@@ -0,0 +1,16 @@
# bug #2023
{.deadCodeElim:on.}
type
Obj = object
iter: iterator (): int8 {.closure.}
iterator test(): int8 {.closure.} =
yield 7
proc init():Obj=
result.iter = test
var o = init()
echo(o.iter())