destructors: some improvements for bug #4214: object constructors are moved too

This commit is contained in:
Araq
2017-11-29 00:01:27 +01:00
parent 7660e59afe
commit c43f718301
2 changed files with 34 additions and 2 deletions

View File

@@ -210,7 +210,7 @@ template recurse(n, dest) =
dest.add p(n[i], c)
proc moveOrCopy(dest, ri: PNode; c: var Con): PNode =
if ri.kind in nkCallKinds:
if ri.kind in nkCallKinds+{nkObjConstr}:
result = genSink(ri.typ, dest)
# watch out and no not transform 'ri' twice if it's a call:
let ri2 = copyNode(ri)
@@ -312,7 +312,7 @@ proc injectDestructorCalls*(owner: PSym; n: PNode): PNode =
result.add body
when defined(nimDebugDestroys):
if owner.name.s == "createSeq":
if owner.name.s == "main" or true:
echo "------------------------------------"
echo owner.name.s, " transformed to: "
echo result

View File

@@ -0,0 +1,32 @@
discard """
output: '''test created
test destroyed 0'''
cmd: '''nim c --newruntime $file'''
"""
# bug #4214
type
Data = object
data: string
rc: int
proc `=destroy`(d: var Data) =
dec d.rc
echo d.data, " destroyed ", d.rc
proc `=`(dst: var Data, src: Data) =
echo src.data, " copied"
dst.data = src.data & " (copy)"
dec dst.rc
inc dst.rc
proc initData(s: string): Data =
result = Data(data: s, rc: 1)
echo s, " created"
proc main =
var x = initData"test"
when isMainModule:
main()