Closed
Description
Test case
type
MyObject* = object
len*: int
amount: UncheckedArray[float]
MyObjPtr* = ptr MyObject
MyObjContainer* {.byref.} = object
size1: int
size2: int
data: ptr UncheckedArray[MyObjPtr]
proc size1*(m: MyObjContainer): int {.inline.} = m.size1
proc size2*(m: MyObjContainer): int {.inline.} = m.size2
proc allocateMyObjPtr(size2: int): MyObjPtr =
cast[MyObjPtr](allocShared(sizeof(MyObject) + sizeof(float) * size2.int))
proc `=destroy`*(m: var MyObjContainer) {.inline.} =
if m.data != nil:
for i in 0..<m.size1:
if m.data[i] != nil:
deallocShared(m.data[i])
m.data[i] = nil
deallocShared(m.data)
echo "=destroy"
m.data = nil
proc `=sink`*(m: var MyObjContainer, m2: MyObjContainer) {.inline.} =
if m.data != m2.data:
`=destroy`(m)
m.size1 = m2.size1
m.size2 = m2.size2
m.data = m2.data
proc `=`*(m: var MyObjContainer, m2: MyObjContainer) {.error.}
## non copyable
func newMyObjContainer*(size2: Natural): MyObjContainer =
result.size2 = size2
proc push(m: var MyObjContainer, cf: MyObjPtr) =
## Add MyObjPtr to MyObjContainer, shallow copy
m.size1.inc
m.data = cast[ptr UncheckedArray[MyObjPtr]](reallocShared(m.data, m.size1 * sizeof(MyObjPtr)))
m.data[m.size1 - 1] = cf
proc add*(m: var MyObjContainer, amount: float) =
assert m.size2 > 0, "MyObjContainer is not initialized, use newMyObjContainer() to initialize object before use"
let cf = allocateMyObjPtr(m.size2)
for i in 0..<m.size2:
cf.amount[i.int] = amount
m.push(cf)
proc add*(dest: var MyObjContainer, src: sink MyObjContainer) =
# merge containers
for i in 0..<src.size1:
dest.push src.data[i]
src.data[i] = nil
proc test =
var cf1 = newMyObjContainer(100)
cf1.add(1)
cf1.add(2)
var cf2 = newMyObjContainer(100)
cf2.add(2)
cf2.add(3)
cf1.add(cf2)
test()
Expected output
=destroy
=destroy
Actual Output
=destroy
Activity