mirror of
https://github.com/nim-lang/Nim.git
synced 2026-07-20 16:01:29 +00:00
@@ -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()
|
||||
Reference in New Issue
Block a user