summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2020-07-30 19:19:59 +0200
committerGitHub <noreply@github.com>2020-07-30 19:19:59 +0200
commit355b2751759b437e90cab16f819edc5cfba2f39b (patch)
treed13cd88cadef9528041b2f8fdcac35be9d474bf6 /compiler
parentd130175342f2b7c1bf87dd05c86509f04cf78154 (diff)
downloadNim-355b2751759b437e90cab16f819edc5cfba2f39b.tar.gz
fixes #15112 (#15124)
Diffstat (limited to 'compiler')
-rw-r--r--compiler/ccgexprs.nim20
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