Files
Nim/tests/gc/closureleak.nim
Andreas Rumpf 3f6df5cc34 fixes #12899 (#12921)
* fixes #12899

* fixes regression: destroy global variables in reverse declaration order, closureleak test relies on it
2019-12-18 07:54:20 +01:00

43 lines
750 B
Nim

discard """
outputsub: "true"
disabled: "32bit"
"""
type
TFoo* = object
id: int
fn: proc() {.closure.}
var foo_counter = 0
var alive_foos = newseq[int](0)
when defined(gcDestructors):
proc `=destroy`(some: var TFoo) =
alive_foos.del alive_foos.find(some.id)
`=destroy`(some.fn)
else:
proc free*(some: ref TFoo) =
#echo "Tfoo #", some.id, " freed"
alive_foos.del alive_foos.find(some.id)
proc newFoo*(): ref TFoo =
when defined(gcDestructors):
new result
else:
new result, free
result.id = foo_counter
alive_foos.add result.id
inc foo_counter
for i in 0 ..< 10:
discard newFoo()
for i in 0 ..< 10:
let f = newFoo()
f.fn = proc =
echo f.id
GC_fullcollect()
echo alive_foos.len <= 3