Skip to content

Commit 53935b8

Browse files
authored
ARC: fixes memory leaks with newSeq used in a loop [backport:1.4] (#18040)
* ARC: fixes memory leaks with newSeq used in a loop [backport:1.4] * Update tests/arc/tnewseq_legacy.nim
1 parent 31143c6 commit 53935b8

File tree

3 files changed

+23
-1
lines changed

3 files changed

+23
-1
lines changed

compiler/ccgexprs.nim

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2319,7 +2319,12 @@ proc genMagicExpr(p: BProc, e: PNode, d: var TLoc, op: TMagic) =
23192319
gcUsage(p.config, e)
23202320
else:
23212321
genNewFinalize(p, e)
2322-
of mNewSeq: genNewSeq(p, e)
2322+
of mNewSeq:
2323+
if optSeqDestructors in p.config.globalOptions:
2324+
e[1] = makeAddr(e[1], p.module.idgen)
2325+
genCall(p, e, d)
2326+
else:
2327+
genNewSeq(p, e)
23232328
of mNewSeqOfCap: genNewSeqOfCap(p, e, d)
23242329
of mSizeOf:
23252330
let t = e[1].typ.skipTypes({tyTypeDesc})

lib/system/seqs_v2.nim

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,3 +124,7 @@ proc setLen[T](s: var seq[T], newlen: Natural) =
124124
if xu.p == nil or xu.p.cap < newlen:
125125
xu.p = cast[typeof(xu.p)](prepareSeqAdd(oldLen, xu.p, newlen - oldLen, sizeof(T), alignof(T)))
126126
xu.len = newlen
127+
128+
proc newSeq[T](s: var seq[T], len: Natural) =
129+
shrink(s, 0)
130+
setLen(s, len)

tests/arc/tnewseq_legacy.nim

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
discard """
2+
output: "(allocCount: 201, deallocCount: 201)"
3+
cmd: "nim c --gc:orc -d:nimAllocStats $file"
4+
"""
5+
6+
proc main(prefix: string) =
7+
var c: seq[string]
8+
for i in 0..<100:
9+
newSeq(c, 100)
10+
c[i] = prefix & $i
11+
12+
main("abc")
13+
echo getAllocStats()

0 commit comments

Comments
 (0)