diff options
Diffstat (limited to 'compiler/ccgexprs.nim')
-rw-r--r-- | compiler/ccgexprs.nim | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 73cc2c8a1..33231b1bc 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -729,14 +729,16 @@ proc genDeref(p: BProc, e: PNode, d: var TLoc) = else: putIntoDest(p, d, e, "(*$1)" % [rdLoc(a)], a.storage) -proc cow(p: BProc; n: PNode) = - if n.kind == nkHiddenAddr and optSeqDestructors in p.config.globalOptions: - if n[0].kind == nkBracketExpr: - let strCandidate = n[0][0] - if strCandidate.typ.skipTypes(abstractInst).kind == tyString: - var a: TLoc - initLocExpr(p, strCandidate, a) - linefmt(p, cpsStmts, "#nimPrepareStrMutationV2($1);$n", [byRefLoc(p, a)]) +proc cowBracket(p: BProc; n: PNode) = + if n.kind == nkBracketExpr and optSeqDestructors in p.config.globalOptions: + let strCandidate = n[0] + if strCandidate.typ.skipTypes(abstractInst).kind == tyString: + var a: TLoc + initLocExpr(p, strCandidate, a) + linefmt(p, cpsStmts, "#nimPrepareStrMutationV2($1);$n", [byRefLoc(p, a)]) + +proc cow(p: BProc; n: PNode) {.inline.} = + if n.kind == nkHiddenAddr: cowBracket(p, n[0]) proc genAddr(p: BProc, e: PNode, d: var TLoc) = # careful 'addr(myptrToArray)' needs to get the ampersand: @@ -1759,6 +1761,8 @@ proc genSwap(p: BProc, e: PNode, d: var TLoc) = # temp = a # a = b # b = temp + cowBracket(p, e[1]) + cowBracket(p, e[2]) var a, b, tmp: TLoc getTemp(p, skipTypes(e[1].typ, abstractVar), tmp) initLocExpr(p, e[1], a) # eval a |