mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
39 lines
703 B
Nim
39 lines
703 B
Nim
discard """
|
|
outputsub: '''f1
|
|
f2
|
|
f3'''
|
|
cmd: "nim c --gc:orc $file"
|
|
valgrind: true
|
|
"""
|
|
|
|
type
|
|
FuncObj = object
|
|
fn: proc (env: pointer) {.cdecl.}
|
|
env: pointer
|
|
|
|
proc `=destroy`(x: var FuncObj) =
|
|
GC_unref(cast[RootRef](x.env))
|
|
|
|
proc `=copy`(x: var FuncObj, y: FuncObj) {.error.}
|
|
|
|
# bug #18433
|
|
|
|
proc main =
|
|
var fs: seq[FuncObj]
|
|
|
|
proc wrap(p: proc()) =
|
|
proc closeOver() = p()
|
|
let env = rawEnv closeOver
|
|
GC_ref(cast[RootRef](env))
|
|
fs.add(FuncObj(fn: cast[proc(env: pointer){.cdecl.}](rawProc closeOver), env: env))
|
|
|
|
wrap(proc() {.closure.} = echo "f1")
|
|
wrap(proc() {.closure.} = echo "f2")
|
|
wrap(proc() {.closure.} = echo "f3")
|
|
|
|
for a in fs:
|
|
a.fn(a.env)
|
|
|
|
main()
|
|
|