summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAndrii Riabushenko <cdome@bk.ru>2018-12-07 21:59:43 +0000
committerAndrii Riabushenko <cdome@bk.ru>2018-12-07 21:59:43 +0000
commit4799589fb3f7f21b2981a7b256fb479054f8492b (patch)
tree0f2ac392aabc31934fe89d8c50b7e073d48ba747
parent135191d9d661581db06a00f4396c024a8fd3a537 (diff)
downloadNim-4799589fb3f7f21b2981a7b256fb479054f8492b.tar.gz
undo some changes
-rw-r--r--compiler/ast.nim2
-rw-r--r--compiler/ccgexprs.nim7
-rw-r--r--compiler/semexprs.nim3
-rw-r--r--lib/system.nim7
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.