diff options
author | ringabout <43030857+ringabout@users.noreply.github.com> | 2023-05-07 03:36:57 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-06 21:36:57 +0200 |
commit | b562e1e6d85d5c64eec1d714257e2f728e60f12f (patch) | |
tree | 67c4dad9040ab9164cabf578695e366b020efc33 /compiler/ccgexprs.nim | |
parent | ba698d37c3254072a3bb946d3750ceaf450da7b4 (diff) | |
download | Nim-b562e1e6d85d5c64eec1d714257e2f728e60f12f.tar.gz |
implement `=dup` hook eliminating `wasMoved` and `=copy` pairs (#21586)
* import `=dup` hook eliminating `wasMoved` and `=copy` pairs * add dup * add a test for dup * fixes documentation * fixes signature * resolve comments * fixes tests * fixes tests * clean up
Diffstat (limited to 'compiler/ccgexprs.nim')
-rw-r--r-- | compiler/ccgexprs.nim | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 265ccb92c..e351e95b0 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -2346,6 +2346,11 @@ proc genMove(p: BProc; n: PNode; d: var TLoc) = genAssignment(p, d, a, {}) resetLoc(p, a) +proc genDup(p: BProc; src: TLoc; d: var TLoc; n: PNode) = + if d.k == locNone: getTemp(p, n.typ, d) + linefmt(p, cpsStmts, "#nimDupRef((void**)$1, (void*)$2);$n", + [addrLoc(p.config, d), rdLoc(src)]) + proc genDestroy(p: BProc; n: PNode) = if optSeqDestructors in p.config.globalOptions: let arg = n[1].skipAddr @@ -2597,6 +2602,11 @@ proc genMagicExpr(p: BProc, e: PNode, d: var TLoc, op: TMagic) = of mAccessTypeField: genAccessTypeField(p, e, d) of mSlice: genSlice(p, e, d) of mTrace: discard "no code to generate" + of mDup: + var a: TLoc + let x = if e[1].kind in {nkAddr, nkHiddenAddr}: e[1][0] else: e[1] + initLocExpr(p, x, a) + genDup(p, a, d, e) else: when defined(debugMagics): echo p.prc.name.s, " ", p.prc.id, " ", p.prc.flags, " ", p.prc.ast[genericParamsPos].kind |