mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-22 07:15:22 +00:00
allows a destructor to be attached to a tyString/tySequence
This commit is contained in:
@@ -34,7 +34,8 @@ when false:
|
||||
proc `=trace`[T](s: NimSeqV2[T]) =
|
||||
for i in 0 ..< s.len: `=trace`(s.data[i])
|
||||
|
||||
proc `=destroy`[T](x: var NimSeqV2[T]) =
|
||||
proc `=destroy`[T](s: var seq[T]) =
|
||||
var x = cast[ptr NimSeqV2[T]](addr s)
|
||||
var p = x.p
|
||||
if p != nil:
|
||||
when not supportsCopyMem(T):
|
||||
@@ -43,7 +44,10 @@ proc `=destroy`[T](x: var NimSeqV2[T]) =
|
||||
x.p = nil
|
||||
x.len = 0
|
||||
|
||||
proc `=`[T](a: var NimSeqV2[T]; b: NimSeqV2[T]) =
|
||||
proc `=`[T](x: var seq[T]; y: seq[T]) =
|
||||
var a = cast[ptr NimSeqV2[T]](addr x)
|
||||
var b = cast[ptr NimSeqV2[T]](unsafeAddr y)
|
||||
|
||||
if a.p == b.p: return
|
||||
`=destroy`(a)
|
||||
a.len = b.len
|
||||
@@ -56,7 +60,9 @@ proc `=`[T](a: var NimSeqV2[T]; b: NimSeqV2[T]) =
|
||||
for i in 0..<a.len:
|
||||
a.p.data[i] = b.p.data[i]
|
||||
|
||||
proc `=sink`[T](a: var NimSeqV2[T]; b: NimSeqV2[T]) =
|
||||
proc `=sink`[T](x: var seq[T]; y: seq[T]) =
|
||||
var a = cast[ptr NimSeqV2[T]](addr x)
|
||||
var b = cast[ptr NimSeqV2[T]](unsafeAddr y)
|
||||
if a.p != nil and a.p != b.p:
|
||||
`=destroy`(a)
|
||||
a.len = b.len
|
||||
|
||||
@@ -45,22 +45,27 @@ template frees(s) =
|
||||
if not isLiteral(s):
|
||||
s.p.region.dealloc(s.p.region, s.p, contentSize(s.p.cap))
|
||||
|
||||
proc `=destroy`(s: var NimStringV2) =
|
||||
frees(s)
|
||||
s.len = 0
|
||||
s.p = nil
|
||||
proc `=destroy`(s: var string) =
|
||||
var a = cast[ptr NimStringV2[T]](addr s)
|
||||
frees(a)
|
||||
a.len = 0
|
||||
a.p = nil
|
||||
|
||||
template lose(a) =
|
||||
frees(a)
|
||||
|
||||
proc `=sink`(a: var NimStringV2, b: NimStringV2) =
|
||||
proc `=sink`(x: var string, y: string) =
|
||||
var a = cast[ptr NimStringV2](addr x)
|
||||
var b = cast[ptr NimStringV2](unsafeAddr y)
|
||||
# we hope this is optimized away for not yet alive objects:
|
||||
if unlikely(a.p == b.p): return
|
||||
lose(a)
|
||||
a.len = b.len
|
||||
a.p = b.p
|
||||
|
||||
proc `=`(a: var NimStringV2; b: NimStringV2) =
|
||||
proc `=`(x: var string, y: string) =
|
||||
var a = cast[ptr NimStringV2](addr x)
|
||||
var b = cast[ptr NimStringV2](unsafeAddr y)
|
||||
if unlikely(a.p == b.p): return
|
||||
lose(a)
|
||||
a.len = b.len
|
||||
|
||||
Reference in New Issue
Block a user