diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2018-11-27 00:26:43 +0100 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2018-11-27 00:36:29 +0100 |
commit | 89907647090390d846dbfc3e31b19dd6deac746e (patch) | |
tree | 234e7fbc1f421e6e2127ba3af14d26cbdcf677c5 /lib | |
parent | 413580bc0444fc9d8e01b6af01433f8c08d2d298 (diff) | |
download | Nim-89907647090390d846dbfc3e31b19dd6deac746e.tar.gz |
some progress on --gc:destructors
Diffstat (limited to 'lib')
-rw-r--r-- | lib/core/seqs.nim | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/lib/core/seqs.nim b/lib/core/seqs.nim index 1981998df..c62a05904 100644 --- a/lib/core/seqs.nim +++ b/lib/core/seqs.nim @@ -82,7 +82,7 @@ type cap: int region: Allocator -proc newSeqPayload(cap, elemSize: int): pointer {.compilerRtl, noSideEffect.} = +proc newSeqPayload(cap, elemSize: int): pointer {.compilerRtl.} = # we have to use type erasure here as Nim does not support generic # compilerProcs. Oh well, this will all be inlined anyway. if cap <= 0: @@ -96,22 +96,23 @@ proc newSeqPayload(cap, elemSize: int): pointer {.compilerRtl, noSideEffect.} = proc prepareSeqAdd(len: int; p: pointer; addlen, elemSize: int): pointer {. compilerRtl, noSideEffect.} = - if len+addlen <= len: - result = p - elif p == nil: - result = newSeqPayload(len+addlen, elemSize) - else: - # Note: this means we cannot support things that have internal pointers as - # they get reallocated here. This needs to be documented clearly. - var p = cast[ptr PayloadBase](p) - let region = if p.region == nil: getLocalAllocator() else: p.region - let cap = max(resize(p.cap), len+addlen) - var q = cast[ptr PayloadBase](region.realloc(region, p, - sizeof(int) + sizeof(Allocator) + elemSize * p.cap, - sizeof(int) + sizeof(Allocator) + elemSize * cap)) - q.region = region - q.cap = cap - result = q + {.noSideEffect.}: + if len+addlen <= len: + result = p + elif p == nil: + result = newSeqPayload(len+addlen, elemSize) + else: + # Note: this means we cannot support things that have internal pointers as + # they get reallocated here. This needs to be documented clearly. + var p = cast[ptr PayloadBase](p) + let region = if p.region == nil: getLocalAllocator() else: p.region + let cap = max(resize(p.cap), len+addlen) + var q = cast[ptr PayloadBase](region.realloc(region, p, + sizeof(int) + sizeof(Allocator) + elemSize * p.cap, + sizeof(int) + sizeof(Allocator) + elemSize * cap)) + q.region = region + q.cap = cap + result = q proc shrink*[T](x: var seq[T]; newLen: Natural) = sysAssert newLen <= x.len, "invalid newLen parameter for 'shrink'" |