summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorringabout <43030857+ringabout@users.noreply.github.com>2023-07-19 18:57:58 +0800
committerGitHub <noreply@github.com>2023-07-19 12:57:58 +0200
commit7d9fe106ecd70bf99b9f3224430debfe10060ce1 (patch)
tree205e2cf8c9bd6ede085537e5e8f279bf88908945
parent1aff402998e6c17a3d72a8dc23fb655208d93fcb (diff)
downloadNim-7d9fe106ecd70bf99b9f3224430debfe10060ce1.tar.gz
fixes #22268; fixes `move` codegen (#22288)
-rw-r--r--compiler/ccgexprs.nim7
-rw-r--r--compiler/liftdestructors.nim6
-rw-r--r--compiler/lowerings.nim13
-rw-r--r--lib/system.nim28
4 files changed, 20 insertions, 34 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim
index 00781a31d..2b9f4221f 100644
--- a/compiler/ccgexprs.nim
+++ b/compiler/ccgexprs.nim
@@ -2359,6 +2359,13 @@ proc genMove(p: BProc; n: PNode; d: var TLoc) =
     if d.k == locNone: getTemp(p, n.typ, d)
     if p.config.selectedGC in {gcArc, gcAtomicArc, gcOrc}:
       genAssignment(p, d, a, {})
+      var op = getAttachedOp(p.module.g.graph, n.typ, attachedWasMoved)
+      if op == nil:
+        resetLoc(p, a)
+      else:
+        let addrExp = makeAddr(n[1], p.module.idgen)
+        let wasMovedCall = newTreeI(nkCall, n.info, newSymNode(op), addrExp)
+        genCall(p, wasMovedCall, d)
     else:
       let flags = if not canMove(p, n[1], d): {needToCopy} else: {}
       genAssignment(p, d, a, flags)
diff --git a/compiler/liftdestructors.nim b/compiler/liftdestructors.nim
index eac2323aa..11d483abb 100644
--- a/compiler/liftdestructors.nim
+++ b/compiler/liftdestructors.nim
@@ -556,7 +556,7 @@ proc fillSeqOp(c: var TLiftCtx; t: PType; body, x, y: PNode) =
     body.add setLenSeqCall(c, t, x, y)
     forallElements(c, t, body, x, y)
   of attachedSink:
-    let moveCall = genBuiltin(c, mMove, "internalMove", x)
+    let moveCall = genBuiltin(c, mMove, "move", x)
     moveCall.add y
     doAssert t.destructor != nil
     moveCall.add destructorCall(c, t.destructor, x)
@@ -589,7 +589,7 @@ proc useSeqOrStrOp(c: var TLiftCtx; t: PType; body, x, y: PNode) =
     body.add newHookCall(c, t.assignment, x, y)
   of attachedSink:
     # we always inline the move for better performance:
-    let moveCall = genBuiltin(c, mMove, "internalMove", x)
+    let moveCall = genBuiltin(c, mMove, "move", x)
     moveCall.add y
     doAssert t.destructor != nil
     moveCall.add destructorCall(c, t.destructor, x)
@@ -620,7 +620,7 @@ proc fillStrOp(c: var TLiftCtx; t: PType; body, x, y: PNode) =
   of attachedAsgn, attachedDeepCopy, attachedDup:
     body.add callCodegenProc(c.g, "nimAsgnStrV2", c.info, genAddr(c, x), y)
   of attachedSink:
-    let moveCall = genBuiltin(c, mMove, "internalMove", x)
+    let moveCall = genBuiltin(c, mMove, "move", x)
     moveCall.add y
     doAssert t.destructor != nil
     moveCall.add destructorCall(c, t.destructor, x)
diff --git a/compiler/lowerings.nim b/compiler/lowerings.nim
index 3f67fc168..d70c713a1 100644
--- a/compiler/lowerings.nim
+++ b/compiler/lowerings.nim
@@ -66,17 +66,8 @@ proc newFastMoveStmt*(g: ModuleGraph, le, ri: PNode): PNode =
   result = newNodeI(nkFastAsgn, le.info, 2)
   result[0] = le
   result[1] = newNodeIT(nkCall, ri.info, ri.typ)
-  if g.config.selectedGC in {gcArc, gcAtomicArc, gcOrc}:
-    result[1].add newSymNode(getCompilerProc(g, "internalMove"))
-    result[1].add ri
-    result = newTreeI(nkStmtList, le.info, result,
-            newTree(nkCall, newSymNode(
-              getSysMagic(g, ri.info, "=wasMoved", mWasMoved)),
-              ri
-              ))
-  else:
-    result[1].add newSymNode(getSysMagic(g, ri.info, "move", mMove))
-    result[1].add ri
+  result[1].add newSymNode(getSysMagic(g, ri.info, "move", mMove))
+  result[1].add ri
 
 proc lowerTupleUnpacking*(g: ModuleGraph; n: PNode; idgen: IdGenerator; owner: PSym): PNode =
   assert n.kind == nkVarTuple
diff --git a/lib/system.nim b/lib/system.nim
index 50debcc89..858571d61 100644
--- a/lib/system.nim
+++ b/lib/system.nim
@@ -151,26 +151,10 @@ proc wasMoved*[T](obj: var T) {.inline, noSideEffect.} =
   {.cast(raises: []), cast(tags: []).}:
     `=wasMoved`(obj)
 
-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)
+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.
@@ -369,6 +353,9 @@ proc arrGet[I: Ordinal;T](a: T; i: I): T {.
 proc arrPut[I: Ordinal;T,S](a: T; i: I;
   x: S) {.noSideEffect, magic: "ArrPut".}
 
+const arcLikeMem = defined(gcArc) or defined(gcAtomicArc) or defined(gcOrc)
+
+
 when defined(nimAllowNonVarDestructor) and arcLikeMem:
   proc `=destroy`*(x: string) {.inline, magic: "Destroy".} =
     discard
@@ -445,6 +432,7 @@ 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