This commit is contained in:
Andreas Rumpf
2021-07-27 14:32:56 +02:00
committed by GitHub
parent c86f9590fb
commit 6dc34757b6
2 changed files with 28 additions and 4 deletions

View File

@@ -207,10 +207,8 @@ proc nimDecRefIsLast(p: pointer): bool {.compilerRtl, inl.} =
proc GC_unref*[T](x: ref T) =
## New runtime only supports this operation for 'ref T'.
if nimDecRefIsLast(cast[pointer](x)):
# XXX this does NOT work for virtual destructors!
`=destroy`(x[])
nimRawDispose(cast[pointer](x), T.alignOf)
var y {.cursor.} = x
`=destroy`(y)
proc GC_ref*[T](x: ref T) =
## New runtime only supports this operation for 'ref T'.

View File

@@ -0,0 +1,26 @@
discard """
outputsub: '''inside closure
hello world'''
cmd: "nim c --gc:orc -d:useMalloc $file"
valgrind: true
"""
# bug #18579
var fp: proc (env: pointer) {.cdecl.}
var env: pointer
proc store(f: proc (){.closure.}) =
proc closeOver() =
echo "inside closure"
f()
(fp,env) = (cast[proc(env: pointer){.cdecl.}](rawProc closeOver), rawEnv closeOver)
GC_ref(cast[RootRef](env))
proc run() =
fp(env)
GC_unref(cast[RootRef](env))
store(proc() = echo "hello world")
run()
GC_fullCollect()