fixes #19291; implements wasMoved hook (#21303)

* fixes #19291; implements `wasMoved` hook

* basics

* checkpoint

* finish `wasMoved`

* add a test for #19291

* add documentation and changelog

* work `attachedWasMoved` with generics

* fixes optimizer

* register `=wasMoved`

* handle wasMoved magcis

* check another round

* some patches

* try `op == nil`

* nicer

* generate `wasMoved` before `destroy`

* try again

* fixes tests

* default wasMoved

* Update tests/destructor/tv2_cast.nim

* Update tests/destructor/tv2_cast.nim

* Update tests/arc/topt_refcursors.nim
This commit is contained in:
ringabout 2023-03-02 12:29:40 +08:00 • committed by GitHub
commit a137e50150
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 131 additions and 39 deletions

View file

@ -1,7 +1,8 @@
discard """
output: ''''''
cmd: '''nim c --gc:arc --expandArc:main --expandArc:tfor --hint:Performance:off $file'''
nimout: '''--expandArc: main
nimout: '''
--expandArc: main
var
a
@ -29,6 +30,7 @@ try:
x = f()
block :tmp:
var i_cursor
mixin inc
var i_1 = 0
block :tmp_1:
while i_1 < 4:
@ -37,25 +39,26 @@ try:
if i_cursor == 2:
return
add(a):
wasMoved(:tmpD)
`=wasMoved`(:tmpD)
`=copy`(:tmpD, x)
:tmpD
inc i_1, 1
if cond:
add(a):
let blitTmp = x
wasMoved(x)
`=wasMoved`(x)
blitTmp
else:
add(b):
let blitTmp_1 = x
wasMoved(x)
`=wasMoved`(x)
blitTmp_1
finally:
`=destroy`(x)
`=destroy_1`(b)
`=destroy_1`(a)
-- end of expandArc ------------------------'''
-- end of expandArc ------------------------
'''
"""
proc f(): seq[int] =