Fixes multiple bugs with sink arguments (#9802)

* fixes #9781

* fix spacing
This commit is contained in:
cooldome 2018-11-26 08:45:45 +00:00 • committed by Andreas Rumpf
commit 2ac7f52388
4 changed files with 59 additions and 11 deletions

View file

@ -8,6 +8,8 @@ allocating
deallocating
deallocating
deallocating
allocating
deallocating
'''
cmd: '''nim c --newruntime $file'''
"""
@ -23,8 +25,7 @@ template incRef(x) =
template decRef(x): untyped = atomicDec(x.refcount)
proc makeShared*[T](x: T): SharedPtr[T] =
# XXX could benefit from 'sink' parameter.
proc makeShared*[T](x: sink T): SharedPtr[T] =
# XXX could benefit from a macro that generates it.
result = cast[SharedPtr[T]](allocShared(sizeof(x)))
result.x[] = x
@ -59,6 +60,9 @@ proc `=sink`*[T](dest: var SharedPtr[T]; src: SharedPtr[T]) =
echo "deallocating"
dest.x = src.x
proc get*[T](s: SharedPtr[T]): lent T =
s.x[]
template `.`*[T](s: SharedPtr[T]; field: untyped): untyped =
s.x.field
@ -99,3 +103,47 @@ proc main =
main()
#-------------------------------------------------------
#bug #9781
type
MySeq* [T] = object
refcount: int
len: int
data: ptr UncheckedArray[T]
proc `=destroy`*[T](m: var MySeq[T]) {.inline.} =
if m.data != nil:
deallocShared(m.data)
m.data = nil
proc `=`*[T](m: var MySeq[T], m2: MySeq[T]) =
if m.data == m2.data: return
if m.data != nil:
`=destroy`(m)
m.len = m2.len
let bytes = m.len.int * sizeof(float)
if bytes > 0:
m.data = cast[ptr UncheckedArray[T]](allocShared(bytes))
copyMem(m.data, m2.data, bytes)
proc `=sink`*[T](m: var MySeq[T], m2: MySeq[T]) {.inline.} =
if m.data != m2.data:
if m.data != nil:
`=destroy`(m)
m.len = m2.len
m.data = m2.data
proc len*[T](m: MySeq[T]): int {.inline.} = m.len
proc newMySeq*[T](size: int, initial_value: T): MySeq[T] =
result.len = size
if size > 0:
result.data = cast[ptr UncheckedArray[T]](allocShared(sizeof(T) * size))
let x = makeShared(newMySeq(10, 1.0))
doAssert: x.get().len == 10