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) =
|
proc GC_unref*[T](x: ref T) =
|
||||||
## New runtime only supports this operation for 'ref T'.
|
## New runtime only supports this operation for 'ref T'.
|
||||||
if nimDecRefIsLast(cast[pointer](x)):
|
var y {.cursor.} = x
|
||||||
# XXX this does NOT work for virtual destructors!
|
`=destroy`(y)
|
||||||
`=destroy`(x[])
|
|
||||||
nimRawDispose(cast[pointer](x), T.alignOf)
|
|
||||||
|
|
||||||
proc GC_ref*[T](x: ref T) =
|
proc GC_ref*[T](x: ref T) =
|
||||||
## New runtime only supports this operation for '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