fixes #3636
This commit is contained in:
parent
8fb6865b24
commit
159a2ff955
4 changed files with 31 additions and 9 deletions
|
|
@ -932,7 +932,7 @@ const
|
||||||
skMacro, skTemplate, skConverter, skEnumField, skLet, skStub, skAlias}
|
skMacro, skTemplate, skConverter, skEnumField, skLet, skStub, skAlias}
|
||||||
PersistentNodeFlags*: TNodeFlags = {nfBase2, nfBase8, nfBase16,
|
PersistentNodeFlags*: TNodeFlags = {nfBase2, nfBase8, nfBase16,
|
||||||
nfDotSetter, nfDotField,
|
nfDotSetter, nfDotField,
|
||||||
nfIsRef, nfIsCursor}
|
nfIsRef, nfIsCursor, nfLL}
|
||||||
namePos* = 0
|
namePos* = 0
|
||||||
patternPos* = 1 # empty except for term rewriting macros
|
patternPos* = 1 # empty except for term rewriting macros
|
||||||
genericParamsPos* = 2
|
genericParamsPos* = 2
|
||||||
|
|
|
||||||
|
|
@ -633,7 +633,6 @@ proc wrapIterBody(n: PNode; owner: PSym): PNode =
|
||||||
getStateField(owner), info))
|
getStateField(owner), info))
|
||||||
stateAsgnStmt.add(newIntTypeNode(nkIntLit, -1, getSysType(tyInt)))
|
stateAsgnStmt.add(newIntTypeNode(nkIntLit, -1, getSysType(tyInt)))
|
||||||
result.add(stateAsgnStmt)
|
result.add(stateAsgnStmt)
|
||||||
result.flags.incl nfLL
|
|
||||||
|
|
||||||
proc symToClosure(n: PNode; owner: PSym; d: DetectionPass;
|
proc symToClosure(n: PNode; owner: PSym; d: DetectionPass;
|
||||||
c: var LiftingPass): PNode =
|
c: var LiftingPass): PNode =
|
||||||
|
|
@ -671,6 +670,8 @@ proc liftCapturedVars(n: PNode; owner: PSym; d: DetectionPass;
|
||||||
let s = n.sym
|
let s = n.sym
|
||||||
if isInnerProc(s):
|
if isInnerProc(s):
|
||||||
if not c.processed.containsOrIncl(s.id):
|
if not c.processed.containsOrIncl(s.id):
|
||||||
|
#if s.name.s == "temp":
|
||||||
|
# echo renderTree(s.getBody, {renderIds})
|
||||||
let body = wrapIterBody(liftCapturedVars(s.getBody, s, d, c), s)
|
let body = wrapIterBody(liftCapturedVars(s.getBody, s, d, c), s)
|
||||||
if c.envvars.getOrDefault(s.id).isNil:
|
if c.envvars.getOrDefault(s.id).isNil:
|
||||||
s.ast.sons[bodyPos] = body
|
s.ast.sons[bodyPos] = body
|
||||||
|
|
@ -696,13 +697,17 @@ proc liftCapturedVars(n: PNode; owner: PSym; d: DetectionPass;
|
||||||
m.typ = n.typ
|
m.typ = n.typ
|
||||||
result = liftCapturedVars(m, owner, d, c)
|
result = liftCapturedVars(m, owner, d, c)
|
||||||
else:
|
else:
|
||||||
if owner.isIterator and n.kind == nkYieldStmt:
|
if owner.isIterator:
|
||||||
result = transformYield(n, owner, d, c)
|
if n.kind == nkYieldStmt:
|
||||||
elif owner.isIterator and n.kind == nkReturnStmt:
|
return transformYield(n, owner, d, c)
|
||||||
result = transformReturn(n, owner, d, c)
|
elif n.kind == nkReturnStmt:
|
||||||
else:
|
return transformReturn(n, owner, d, c)
|
||||||
for i in 0..<n.len:
|
elif nfLL in n.flags:
|
||||||
n.sons[i] = liftCapturedVars(n[i], owner, d, c)
|
# special case 'when nimVm' due to bug #3636:
|
||||||
|
n.sons[1] = liftCapturedVars(n[1], owner, d, c)
|
||||||
|
return
|
||||||
|
for i in 0..<n.len:
|
||||||
|
n.sons[i] = liftCapturedVars(n[i], owner, d, c)
|
||||||
|
|
||||||
# ------------------ old stuff -------------------------------------------
|
# ------------------ old stuff -------------------------------------------
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1817,6 +1817,7 @@ proc semWhen(c: PContext, n: PNode, semCheck = true): PNode =
|
||||||
whenNimvm = lookUp(c, exprNode).magic == mNimvm
|
whenNimvm = lookUp(c, exprNode).magic == mNimvm
|
||||||
elif exprNode.kind == nkSym:
|
elif exprNode.kind == nkSym:
|
||||||
whenNimvm = exprNode.sym.magic == mNimvm
|
whenNimvm = exprNode.sym.magic == mNimvm
|
||||||
|
if whenNimvm: n.flags.incl nfLL
|
||||||
|
|
||||||
for i in countup(0, sonsLen(n) - 1):
|
for i in countup(0, sonsLen(n) - 1):
|
||||||
var it = n.sons[i]
|
var it = n.sons[i]
|
||||||
|
|
|
||||||
16
tests/iter/twrap_walkdir.nim
Normal file
16
tests/iter/twrap_walkdir.nim
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
# bug #3636
|
||||||
|
|
||||||
|
proc fooIt(foo: string): iterator(): (string) =
|
||||||
|
iterator temp(): (string) =
|
||||||
|
for f in walkDirRec(foo): # No problem with walkFiles
|
||||||
|
yield f
|
||||||
|
return temp
|
||||||
|
|
||||||
|
let it = fooIt(".")
|
||||||
|
for x in it():
|
||||||
|
echo x
|
||||||
Loading…
Add table
Add a link
Reference in a new issue