This commit is contained in:
Andreas Rumpf
2020-03-19 12:57:45 +01:00
committed by GitHub
parent 1f2042411a
commit 034dad8e32
2 changed files with 34 additions and 2 deletions

View File

@@ -602,7 +602,10 @@ proc pVarTopLevel(v: PNode; c: var Con; ri, res: PNode) =
res.add newTree(nkFastAsgn, v, genDefaultCall(v.typ, c, v.info))
elif sfThread notin v.sym.flags:
# do not destroy thread vars for now at all for consistency.
c.destroys.add genDestroy(c, v)
if sfGlobal in v.sym.flags:
c.graph.globalDestructors.add genDestroy(c, v)
else:
c.destroys.add genDestroy(c, v)
if ri.kind == nkEmpty and c.inLoop > 0:
res.add moveOrCopy(v, genDefaultCall(v.typ, c, v.info), c)
elif ri.kind != nkEmpty:
@@ -616,7 +619,7 @@ proc pVarScoped(v: PNode; c: var Con; ri, res: PNode) =
# unpacked tuple needs reset at every loop iteration
res.add newTree(nkFastAsgn, v, genDefaultCall(v.typ, c, v.info))
elif {sfGlobal, sfThread} * v.sym.flags == {sfGlobal}:
c.destroys.add genDestroy(c, v)
c.graph.globalDestructors.add genDestroy(c, v)
else:
# We always translate 'var v = f()' into bitcopies. If 'v' is in a loop,
# the destruction at the loop end will free the resources. Other assignments

29
tests/arc/tarcmisc.nim Normal file
View File

@@ -0,0 +1,29 @@
discard """
output: '''
destroyed: false
destroyed: false
destroying variable'''
cmd: "nim c --gc:arc $file"
"""
# bug #13691
type Variable = ref object
value: int
proc `=destroy`(self: var typeof(Variable()[])) =
echo "destroying variable"
proc newVariable(value: int): Variable =
result = Variable()
result.value = value
proc test(count: int) =
var v {.global.} = newVariable(10)
var count = count - 1
if count == 0: return
test(count)
echo "destroyed: ", v.isNil
test(3)