diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2020-07-30 19:19:59 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-30 19:19:59 +0200 |
commit | 355b2751759b437e90cab16f819edc5cfba2f39b (patch) | |
tree | d13cd88cadef9528041b2f8fdcac35be9d474bf6 /compiler | |
parent | d130175342f2b7c1bf87dd05c86509f04cf78154 (diff) | |
download | Nim-355b2751759b437e90cab16f819edc5cfba2f39b.tar.gz |
fixes #15112 (#15124)
Diffstat (limited to 'compiler')
-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 |