diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2019-06-26 19:34:05 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2019-06-26 19:34:05 +0200 |
commit | e083a1533b40ed768b2085852b714ea8e5564f4f (patch) | |
tree | f05cdff70c0ef7be93ac225962ad760cae012a63 /compiler | |
parent | f288e1b11ab3c796b213fe139f6dcb9c1897218f (diff) | |
download | Nim-e083a1533b40ed768b2085852b714ea8e5564f4f.tar.gz |
fixes #11098
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/ccgexprs.nim | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 1c1b9feac..471ede381 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -1306,11 +1306,17 @@ proc genNewSeqOfCap(p: BProc; e: PNode; d: var TLoc) = let seqtype = skipTypes(e.typ, abstractVarRange) var a: TLoc initLocExpr(p, e.sons[1], a) - putIntoDest(p, d, e, ropecg(p.module, - "($1)#nimNewSeqOfCap($2, $3)", [ - getTypeDesc(p.module, seqtype), - genTypeInfo(p.module, seqtype, e.info), a.rdLoc])) - gcUsage(p.config, e) + if p.config.selectedGC == gcDestructors: + if d.k == locNone: getTemp(p, e.typ, d, needsInit=false) + linefmt(p, cpsStmts, "$1.len = 0; $1.p = ($4*) #newSeqPayload($2, sizeof($3));$n", + [d.rdLoc, a.rdLoc, getTypeDesc(p.module, seqtype.lastSon), + getSeqPayloadType(p.module, seqtype)]) + else: + putIntoDest(p, d, e, ropecg(p.module, + "($1)#nimNewSeqOfCap($2, $3)", [ + getTypeDesc(p.module, seqtype), + genTypeInfo(p.module, seqtype, e.info), a.rdLoc])) + gcUsage(p.config, e) proc genConstExpr(p: BProc, n: PNode): Rope proc handleConstExpr(p: BProc, n: PNode, d: var TLoc): bool = |