diff options
author | ringabout <43030857+ringabout@users.noreply.github.com> | 2023-07-19 18:57:58 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-19 12:57:58 +0200 |
commit | 7d9fe106ecd70bf99b9f3224430debfe10060ce1 (patch) | |
tree | 205e2cf8c9bd6ede085537e5e8f279bf88908945 | |
parent | 1aff402998e6c17a3d72a8dc23fb655208d93fcb (diff) | |
download | Nim-7d9fe106ecd70bf99b9f3224430debfe10060ce1.tar.gz |
fixes #22268; fixes `move` codegen (#22288)
-rw-r--r-- | compiler/ccgexprs.nim | 7 | ||||
-rw-r--r-- | compiler/liftdestructors.nim | 6 | ||||
-rw-r--r-- | compiler/lowerings.nim | 13 | ||||
-rw-r--r-- | lib/system.nim | 28 |
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 |