diff options
author | ringabout <43030857+ringabout@users.noreply.github.com> | 2023-05-12 21:24:14 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-12 15:24:14 +0200 |
commit | ddce5559981ac5dedd3a5dfb210eb25296e69307 (patch) | |
tree | c65eaaba45022b9587b41fa857d97c95c9ccc0f9 /lib | |
parent | 871e4af6ef384ef27c9357dab24ab727a2006eae (diff) | |
download | Nim-ddce5559981ac5dedd3a5dfb210eb25296e69307.tar.gz |
improve `wasMoved` hooks; allow reset to use the overridden `wasMoved` hook (#21831)
* improve `wasMoved` hooks * Because `wasMoved` is lifted
Diffstat (limited to 'lib')
-rw-r--r-- | lib/system.nim | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/lib/system.nim b/lib/system.nim index e7b6ed7c3..f8523b094 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -137,15 +137,20 @@ proc new*[T](a: var ref T, finalizer: proc (x: ref T) {.nimcall.}) {. ## **Note**: The `finalizer` refers to the type `T`, not to the object! ## This means that for each object of type `T` the finalizer will be called! -proc wasMoved*[T](obj: var T) {.magic: "WasMoved", noSideEffect.} = +proc `=wasMoved`[T](obj: var T) {.magic: "WasMoved", noSideEffect.} = + ## Generic `wasMoved`:idx: implementation that can be overridden. + +proc wasMoved*[T](obj: var T) {.inline, 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 + {.cast(raises: []), cast(tags: []).}: + `=wasMoved`(obj) proc move*[T](x: var T): T {.magic: "Move", noSideEffect.} = result = x - wasMoved(x) + {.cast(raises: []), cast(tags: []).}: + `=wasMoved`(x) type range*[T]{.magic: "Range".} ## Generic type to construct range types. @@ -912,7 +917,7 @@ proc reset*[T](obj: var T) {.noSideEffect.} = when defined(gcDestructors): {.cast(noSideEffect), cast(raises: []), cast(tags: []).}: `=destroy`(obj) - wasMoved(obj) + `=wasMoved`(obj) else: obj = default(typeof(obj)) |