This commit is contained in:
Andreas Rumpf 2020-07-30 19:19:59 +02:00 • committed by GitHub
commit 355b275175
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -729,15 +729,17 @@ proc genDeref(p: BProc, e: PNode, d: var TLoc) =
else: else:
putIntoDest(p, d, e, "(*$1)" % [rdLoc(a)], a.storage) putIntoDest(p, d, e, "(*$1)" % [rdLoc(a)], a.storage)
proc cow(p: BProc; n: PNode) = proc cowBracket(p: BProc; n: PNode) =
if n.kind == nkHiddenAddr and optSeqDestructors in p.config.globalOptions: if n.kind == nkBracketExpr and optSeqDestructors in p.config.globalOptions:
if n[0].kind == nkBracketExpr: let strCandidate = n[0]
let strCandidate = n[0][0]
if strCandidate.typ.skipTypes(abstractInst).kind == tyString: if strCandidate.typ.skipTypes(abstractInst).kind == tyString:
var a: TLoc var a: TLoc
initLocExpr(p, strCandidate, a) initLocExpr(p, strCandidate, a)
linefmt(p, cpsStmts, "#nimPrepareStrMutationV2($1);$n", [byRefLoc(p, 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) = proc genAddr(p: BProc, e: PNode, d: var TLoc) =
# careful 'addr(myptrToArray)' needs to get the ampersand: # careful 'addr(myptrToArray)' needs to get the ampersand:
if e[0].typ.skipTypes(abstractInstOwned).kind in {tyRef, tyPtr}: if e[0].typ.skipTypes(abstractInstOwned).kind in {tyRef, tyPtr}:
@ -1759,6 +1761,8 @@ proc genSwap(p: BProc, e: PNode, d: var TLoc) =
# temp = a # temp = a
# a = b # a = b
# b = temp # b = temp
cowBracket(p, e[1])
cowBracket(p, e[2])
var a, b, tmp: TLoc var a, b, tmp: TLoc
getTemp(p, skipTypes(e[1].typ, abstractVar), tmp) getTemp(p, skipTypes(e[1].typ, abstractVar), tmp)
initLocExpr(p, e[1], a) # eval a initLocExpr(p, e[1], a) # eval a