C codegen: support system.move and system.wasMoved
This commit is contained in:
parent
3c461755e2
commit
c38a608c90
2 changed files with 38 additions and 0 deletions
|
|
@ -1864,6 +1864,23 @@ proc binaryFloatArith(p: BProc, e: PNode, d: var TLoc, m: TMagic) =
|
||||||
else:
|
else:
|
||||||
binaryArith(p, e, d, m)
|
binaryArith(p, e, d, m)
|
||||||
|
|
||||||
|
proc skipAddr(n: PNode): PNode =
|
||||||
|
result = if n.kind in {nkAddr, nkHiddenAddr}: n[0] else: n
|
||||||
|
|
||||||
|
proc genWasMoved(p: BProc; n: PNode) =
|
||||||
|
var a: TLoc
|
||||||
|
initLocExpr(p, n[1].skipAddr, a)
|
||||||
|
resetLoc(p, a)
|
||||||
|
#linefmt(p, cpsStmts, "#nimZeroMem((void*)$1, sizeof($2));$n",
|
||||||
|
# addrLoc(p.config, a), getTypeDesc(p.module, a.t))
|
||||||
|
|
||||||
|
proc genMove(p: BProc; n: PNode; d: var TLoc) =
|
||||||
|
if d.k == locNone: getTemp(p, n.typ, d)
|
||||||
|
var a: TLoc
|
||||||
|
initLocExpr(p, n[1].skipAddr, a)
|
||||||
|
genAssignment(p, d, a, {})
|
||||||
|
resetLoc(p, a)
|
||||||
|
|
||||||
proc genMagicExpr(p: BProc, e: PNode, d: var TLoc, op: TMagic) =
|
proc genMagicExpr(p: BProc, e: PNode, d: var TLoc, op: TMagic) =
|
||||||
case op
|
case op
|
||||||
of mOr, mAnd: genAndOr(p, e, d, op)
|
of mOr, mAnd: genAndOr(p, e, d, op)
|
||||||
|
|
@ -1991,6 +2008,8 @@ proc genMagicExpr(p: BProc, e: PNode, d: var TLoc, op: TMagic) =
|
||||||
initLocExpr(p, e.sons[2], b)
|
initLocExpr(p, e.sons[2], b)
|
||||||
genDeepCopy(p, a, b)
|
genDeepCopy(p, a, b)
|
||||||
of mDotDot, mEqCString: genCall(p, e, d)
|
of mDotDot, mEqCString: genCall(p, e, d)
|
||||||
|
of mWasMoved: genWasMoved(p, e)
|
||||||
|
of mMove: genMove(p, e, d)
|
||||||
else:
|
else:
|
||||||
when defined(debugMagics):
|
when defined(debugMagics):
|
||||||
echo p.prc.name.s, " ", p.prc.id, " ", p.prc.flags, " ", p.prc.ast[genericParamsPos].kind
|
echo p.prc.name.s, " ", p.prc.id, " ", p.prc.flags, " ", p.prc.ast[genericParamsPos].kind
|
||||||
|
|
|
||||||
19
tests/destructor/texplicit_move.nim
Normal file
19
tests/destructor/texplicit_move.nim
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
|
||||||
|
discard """
|
||||||
|
output: '''3
|
||||||
|
0
|
||||||
|
destroyed!'''
|
||||||
|
"""
|
||||||
|
|
||||||
|
type
|
||||||
|
myseq* = object
|
||||||
|
f: int
|
||||||
|
|
||||||
|
proc `=destroy`*(x: var myseq) =
|
||||||
|
echo "destroyed!"
|
||||||
|
|
||||||
|
var
|
||||||
|
x: myseq
|
||||||
|
x.f = 3
|
||||||
|
echo move(x.f)
|
||||||
|
echo x.f
|
||||||
Loading…
Add table
Add a link
Reference in a new issue