summary refs log blame commit diff stats
path: root/tests/arc/tfuncobj.nim
blob: 50cd9425e1fb4286706f7d5aeaa898a4ee1155a7 (plain) (tree)





































                                                                                       
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()