mirror of
https://github.com/nim-lang/Nim.git
synced 2026-06-06 11:54:11 +00:00
fixes a closure iterator memory leaks, progress on #15076
This commit is contained in:
@@ -787,7 +787,7 @@ proc p(n: PNode; c: var Con; s: var Scope; mode: ProcessMode): PNode =
|
||||
if ri.kind == nkEmpty and c.inLoop > 0:
|
||||
ri = genDefaultCall(v.typ, c, v.info)
|
||||
if ri.kind != nkEmpty:
|
||||
result.add moveOrCopy(v, ri, c, s, isDecl = true)
|
||||
result.add moveOrCopy(v, ri, c, s, isDecl = false)
|
||||
else: # keep the var but transform 'ri':
|
||||
var v = copyNode(n)
|
||||
var itCopy = copyNode(it)
|
||||
|
||||
36
tests/arc/tclosureiter.nim
Normal file
36
tests/arc/tclosureiter.nim
Normal file
@@ -0,0 +1,36 @@
|
||||
discard """
|
||||
cmd: '''nim c -d:nimAllocStats --gc:arc $file'''
|
||||
output: '''(allocCount: 102, deallocCount: 102)'''
|
||||
"""
|
||||
|
||||
type
|
||||
FutureBase = ref object
|
||||
someData: string
|
||||
|
||||
const
|
||||
# Just to occupy some RAM
|
||||
BigData = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
|
||||
iterator mainIter(): FutureBase {.closure.} =
|
||||
for x in 0 .. 100:
|
||||
var internalTmpFuture = FutureBase(someData: BigData)
|
||||
yield internalTmpFuture
|
||||
|
||||
proc main() =
|
||||
var nameIterVar = mainIter
|
||||
var next = nameIterVar()
|
||||
while not isNil(next):
|
||||
next = nameIterVar()
|
||||
if not isNil(next):
|
||||
doAssert next.someData.len == 97
|
||||
# GC_unref(next)
|
||||
# If you uncomment the GC_ref above,
|
||||
# the program basically uses no memory after the run.
|
||||
# but crashes with refc, which might indicate
|
||||
# that arc/orc simply never frees the result of "next"?
|
||||
if finished(nameIterVar):
|
||||
break
|
||||
|
||||
main()
|
||||
GC_fullCollect()
|
||||
echo getAllocStats()
|
||||
Reference in New Issue
Block a user