fixes #22237; fixes #21160; wrong cursor on unowned parameters in the for loop in ORC (#22240)

fixes #22237; fixes #21160; wrong cursor on unowned parameters
This commit is contained in:
ringabout
2023-07-10 16:31:13 +08:00
committed by GitHub
parent 1b132ddaa2
commit ecc6ab7ee0
2 changed files with 70 additions and 2 deletions

View File

@@ -654,7 +654,7 @@ proc findWrongOwners(c: PTransf, n: PNode) =
else:
for i in 0..<n.safeLen: findWrongOwners(c, n[i])
proc isSimpleIteratorVar(c: PTransf; iter: PSym): bool =
proc isSimpleIteratorVar(c: PTransf; iter: PSym; call: PNode; owner: PSym): bool =
proc rec(n: PNode; owner: PSym; dangerousYields: var int) =
case n.kind
of nkEmpty..nkNilLit: discard
@@ -666,9 +666,22 @@ proc isSimpleIteratorVar(c: PTransf; iter: PSym): bool =
else:
for c in n: rec(c, owner, dangerousYields)
proc recSym(n: PNode; owner: PSym; sameOwner: var bool) =
case n.kind
of {nkEmpty..nkNilLit} - {nkSym}: discard
of nkSym:
if n.sym.owner != owner:
sameOwner = false
else:
for c in n: recSym(c, owner, sameOwner)
var dangerousYields = 0
rec(getBody(c.graph, iter), iter, dangerousYields)
result = dangerousYields == 0
# the parameters should be owned by the owner
# bug #22237
for i in 1..<call.len:
recSym(call[i], owner, result)
template destructor(t: PType): PSym = getAttachedOp(c.graph, t, attachedDestructor)
@@ -712,7 +725,7 @@ proc transformFor(c: PTransf, n: PNode): PNode =
for j in 0..<n[i].len-1:
addVar(v, copyTree(n[i][j])) # declare new vars
else:
if n[i].kind == nkSym and isSimpleIteratorVar(c, iter):
if n[i].kind == nkSym and isSimpleIteratorVar(c, iter, call, n[i].sym.owner):
incl n[i].sym.flags, sfCursor
addVar(v, copyTree(n[i])) # declare new vars
stmtList.add(v)

55
tests/arc/t22237.nim Normal file
View File

@@ -0,0 +1,55 @@
discard """
matrix: "--mm:arc; --mm:orc"
"""
import std/macros
import std/streams
# bug #22237
proc iterlines_closure2(f: File | Stream): iterator (): string =
result = iterator(): string =
for line in f.lines:
if line.len == 0:
break
yield line
proc test() =
let f = newStringStream("""
1
2
3
4
5
6
7
8
""")
while not f.atEnd():
let iterator_inst = iterlines_closure2(f)
for item in iterator_inst(): # Fails with "SIGSEGV: Illegal storage access. (Attempt to read from nil?)"
discard
test()
# bug #21160
import sequtils
iterator allMoves(fls: seq[int]): seq[int] =
yield fls
proc neighbors(flrs: seq[int]): iterator: seq[int] =
return iterator(): seq[int] =
for flrs2 in allMoves(flrs):
yield flrs2
for flrs3 in allMoves(flrs2):
yield flrs3
let f = @[1]
for _ in neighbors(f):
discard
for _ in neighbors(f):
discard