diff options
author | Andrii Riabushenko <cdome@bk.ru> | 2018-12-07 21:59:43 +0000 |
---|---|---|
committer | Andrii Riabushenko <cdome@bk.ru> | 2018-12-07 21:59:43 +0000 |
commit | 4799589fb3f7f21b2981a7b256fb479054f8492b (patch) | |
tree | 0f2ac392aabc31934fe89d8c50b7e073d48ba747 | |
parent | 135191d9d661581db06a00f4396c024a8fd3a537 (diff) | |
download | Nim-4799589fb3f7f21b2981a7b256fb479054f8492b.tar.gz |
undo some changes
-rw-r--r-- | compiler/ast.nim | 2 | ||||
-rw-r--r-- | compiler/ccgexprs.nim | 7 | ||||
-rw-r--r-- | compiler/semexprs.nim | 3 | ||||
-rw-r--r-- | lib/system.nim | 7 |
4 files changed, 16 insertions, 3 deletions
diff --git a/compiler/ast.nim b/compiler/ast.nim index 2b595aee1..7cf35450b 100644 --- a/compiler/ast.nim +++ b/compiler/ast.nim @@ -627,7 +627,7 @@ type mIsPartOf, mAstToStr, mParallel, mSwap, mIsNil, mArrToSeq, mCopyStr, mCopyStrLast, mNewString, mNewStringOfCap, mParseBiggestFloat, - mMove, mDestroy, + mMove, mWasMoved, mDestroy, mReset, mArray, mOpenArray, mRange, mSet, mSeq, mOpt, mVarargs, mRef, mPtr, mVar, mDistinct, mVoid, mTuple, diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index bf1494b3d..0cb3d3ad5 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -1901,6 +1901,13 @@ proc binaryFloatArith(p: BProc, e: PNode, d: var TLoc, m: TMagic) = 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 diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 517356434..669862c56 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -614,7 +614,8 @@ proc analyseIfAddressTakenInCall(c: PContext, n: PNode) = const FakeVarParams = {mNew, mNewFinalize, mInc, ast.mDec, mIncl, mExcl, mSetLengthStr, mSetLengthSeq, mAppendStrCh, mAppendStrStr, mSwap, - mAppendSeqElem, mNewSeq, mReset, mShallowCopy, mDeepCopy, mMove} + mAppendSeqElem, mNewSeq, mReset, mShallowCopy, mDeepCopy, mMove, + mWasMoved} # get the real type of the callee # it may be a proc var with a generic alias type, so we skip over them diff --git a/lib/system.nim b/lib/system.nim index ec0dd629c..9111ddd86 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -221,10 +221,15 @@ proc reset*[T](obj: var T) {.magic: "Reset", noSideEffect.} ## be called before any possible `object branch transition`:idx:. when defined(nimNewRuntime): + proc wasMoved*[T](obj: var T) {.magic: "WasMoved", noSideEffect.} = + ## resets an object `obj` to its initial (binary zero) value to signify + ## it was "moved" and to signify its destructor should do nothing and + ## ideally be optimized away. + discard proc move*[T](x: var T): T {.magic: "Move", noSideEffect.} = result = x - reset(x) + wasMoved(x) type range*{.magic: "Range".}[T] ## Generic type to construct range types. |