fixes #2023
This commit is contained in:
parent
3b45ac44e1
commit
ecc3c3bd03
2 changed files with 19 additions and 3 deletions
|
|
@ -719,7 +719,7 @@ proc outerProcSons(o: POuterContext, n: PNode, it: TIter) =
|
||||||
let x = transformOuterProc(o, n.sons[i], it)
|
let x = transformOuterProc(o, n.sons[i], it)
|
||||||
if x != nil: n.sons[i] = x
|
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))
|
# transforms (iter) to (let env = newClosure[iter](); (iter, env))
|
||||||
let iter = n.sym
|
let iter = n.sym
|
||||||
assert iter.kind == skClosureIterator
|
assert iter.kind == skClosureIterator
|
||||||
|
|
@ -727,7 +727,7 @@ proc liftIterSym(n: PNode): PNode =
|
||||||
result = newNodeIT(nkStmtListExpr, n.info, n.typ)
|
result = newNodeIT(nkStmtListExpr, n.info, n.typ)
|
||||||
|
|
||||||
let hp = getHiddenParam(iter)
|
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.typ = hp.typ
|
||||||
env.flags = hp.flags
|
env.flags = hp.flags
|
||||||
var v = newNodeI(nkVarSection, n.info)
|
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?
|
# XXX why doesn't this work?
|
||||||
var closure = PEnv(idTableGet(o.lambdasToEnv, local))
|
var closure = PEnv(idTableGet(o.lambdasToEnv, local))
|
||||||
if closure.isNil:
|
if closure.isNil:
|
||||||
return liftIterSym(n)
|
return liftIterSym(n, o.fn)
|
||||||
else:
|
else:
|
||||||
let createdVar = generateIterClosureCreation(o, closure,
|
let createdVar = generateIterClosureCreation(o, closure,
|
||||||
closure.attachedNode)
|
closure.attachedNode)
|
||||||
|
|
|
||||||
16
tests/iter/tobj_iter.nim
Normal file
16
tests/iter/tobj_iter.nim
Normal 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())
|
||||||
Loading…
Add table
Add a link
Reference in a new issue