summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
authorringabout <43030857+ringabout@users.noreply.github.com>2023-06-09 21:53:12 +0800
committerGitHub <noreply@github.com>2023-06-09 15:53:12 +0200
commit64b27edd3aa6035bfc5f4e1d83237283bd3b7c2b (patch)
tree05e3a82adf3252b56eb8508d25d1dfcb0e3faa8e /lib
parent49e11d9dcc00d4c758b754e7a89f9d0253d25ea0 (diff)
downloadNim-64b27edd3aa6035bfc5f4e1d83237283bd3b7c2b.tar.gz
make `move` use `=wasMoved` internally (#22032)
* make `move` use `=wasMoved` internally

* fixes tests

* fixes spawn finally

* fixes views

* rename to internalMove

* add a test case
Diffstat (limited to 'lib')
-rw-r--r--lib/system.nim25
1 files changed, 20 insertions, 5 deletions
diff --git a/lib/system.nim b/lib/system.nim
index 3a39da32e..949d717b0 100644
--- a/lib/system.nim
+++ b/lib/system.nim
@@ -147,10 +147,26 @@ proc wasMoved*[T](obj: var T) {.inline, noSideEffect.} =
   {.cast(raises: []), cast(tags: []).}:
     `=wasMoved`(obj)
 
-proc move*[T](x: var T): T {.magic: "Move", noSideEffect.} =
-  result = x
-  {.cast(raises: []), cast(tags: []).}:
-    `=wasMoved`(x)
+const notJSnotNims = not defined(js) and not defined(nimscript)
+const arcLikeMem = defined(gcArc) or defined(gcAtomicArc) or defined(gcOrc)
+
+when notJSnotNims and arcLikeMem:
+  proc internalMove[T](x: var T): T {.magic: "Move", noSideEffect, compilerproc.} =
+    result = x
+
+  proc move*[T](x: var T): T {.noSideEffect, nodestroy.} =
+    {.cast(noSideEffect).}:
+      when nimvm:
+        result = internalMove(x)
+      else:
+        result = internalMove(x)
+        {.cast(raises: []), cast(tags: []).}:
+          `=wasMoved`(x)
+else:
+  proc move*[T](x: var T): T {.magic: "Move", noSideEffect.} =
+    result = x
+    {.cast(raises: []), cast(tags: []).}:
+      `=wasMoved`(x)
 
 type
   range*[T]{.magic: "Range".}         ## Generic type to construct range types.
@@ -415,7 +431,6 @@ include "system/inclrtl"
 const NoFakeVars = defined(nimscript) ## `true` if the backend doesn't support \
   ## "fake variables" like `var EBADF {.importc.}: cint`.
 
-const notJSnotNims = not defined(js) and not defined(nimscript)
 
 when not defined(js) and not defined(nimSeqsV2):
   type