parent
c86f9590fb
commit
6dc34757b6
2 changed files with 28 additions and 4 deletions
|
|
@ -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'.
|
||||
|
|
|
|||
26
tests/arc/tunref_cycle.nim
Normal file
26
tests/arc/tunref_cycle.nim
Normal 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()
|
||||
Loading…
Add table
Add a link
Reference in a new issue