Nim/tests/destructor/tv2_cast.nim
ringabout a137e50150
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
2023-03-02 05:29:40 +01:00

148 lines
2.6 KiB
Nim

discard """
output: '''@[1]
@[116, 101, 115, 116]
@[1953719668, 875770417]
destroying O1'''
cmd: '''nim c --gc:arc --expandArc:main --expandArc:main1 --expandArc:main2 --expandArc:main3 --hints:off --assertions:off $file'''
nimout: '''
--expandArc: main
var
data
:tmpD
:tmpD_1
:tmpD_2
data =
`=wasMoved`(:tmpD)
`=copy`(:tmpD, cast[string](
:tmpD_2 = encode(cast[seq[byte]](
:tmpD_1 = newString(100)
:tmpD_1))
:tmpD_2))
:tmpD
`=destroy`(:tmpD_2)
`=destroy_1`(:tmpD_1)
`=destroy_1`(data)
-- end of expandArc ------------------------
--expandArc: main1
var
s
data
:tmpD
:tmpD_1
s = newString(100)
data =
`=wasMoved`(:tmpD)
`=copy`(:tmpD, cast[string](
:tmpD_1 = encode(toOpenArrayByte(s, 0, len(s) - 1))
:tmpD_1))
:tmpD
`=destroy`(:tmpD_1)
`=destroy_1`(data)
`=destroy_1`(s)
-- end of expandArc ------------------------
--expandArc: main2
var
s
data
:tmpD
:tmpD_1
s = newSeq(100)
data =
`=wasMoved`(:tmpD)
`=copy`(:tmpD, cast[string](
:tmpD_1 = encode(s)
:tmpD_1))
:tmpD
`=destroy`(:tmpD_1)
`=destroy_1`(data)
`=destroy`(s)
-- end of expandArc ------------------------
--expandArc: main3
var
data
:tmpD
:tmpD_1
:tmpD_2
data =
`=wasMoved`(:tmpD)
`=copy`(:tmpD, cast[string](
:tmpD_2 = encode do:
:tmpD_1 = newSeq(100)
:tmpD_1
:tmpD_2))
:tmpD
`=destroy`(:tmpD_2)
`=destroy`(:tmpD_1)
`=destroy_1`(data)
-- end of expandArc ------------------------
'''
"""
func encode*(src: openArray[byte]): seq[byte] =
result = newSeq[byte](src.len)
template compress*(src: string): string =
cast[string](encode(cast[seq[byte]](src)))
proc main =
let data = compress(newString(100))
main()
proc main1 =
var
s = newString(100)
let data = cast[string](encode(s.toOpenArrayByte(0, s.len-1)))
main1()
proc main2 =
var
s = newSeq[byte](100)
let data = cast[string](encode(s))
main2()
proc main3 =
let data = cast[string](encode(newSeq[byte](100)))
main3()
# bug #11018
discard cast[seq[uint8]](@[1])
discard cast[seq[uint8]]("test")
echo cast[seq[uint8]](@[1])
echo cast[seq[uint8]]("test")
discard cast[string](@[116'u8, 101, 115, 116])
#echo cast[string](@[116'u8, 101, 115, 116, 0])
var a = cast[seq[uint32]]("test1234")
a.setLen(2)
echo a
#issue 11204
var ac {.compileTime.} = @["a", "b"]
const bc = ac.len
type
O = object of RootRef
i: int
O1 = object of O
O2 = object of O
proc `=destroy`(o: var O) =
echo "destroying O"
proc `=destroy`(o: var O1) =
echo "destroying O1"
proc `=destroy`(o: var O2) =
echo "destroying O2"
proc test =
let o3 = cast[ref O2]((ref O1)())
test()