diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2017-09-16 10:56:28 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2017-09-16 10:56:28 +0200 |
commit | e7bcadaf3260b34e7c8b313549b93130f3ea79e4 (patch) | |
tree | bf72070135940c9a3137c4366f683e3a99d0a87d | |
parent | 2b592a64259e4f66b0ad5dd7264f7b524c309fee (diff) | |
download | Nim-e7bcadaf3260b34e7c8b313549b93130f3ea79e4.tar.gz |
hotfix: fixes seq.add and str.add for edge cases
-rw-r--r-- | lib/system/sysstr.nim | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/lib/system/sysstr.nim b/lib/system/sysstr.nim index c3150cb07..9ba53a5b8 100644 --- a/lib/system/sysstr.nim +++ b/lib/system/sysstr.nim @@ -140,9 +140,10 @@ proc addChar(s: NimString, c: char): NimString = # is compilerproc! result = s if result.len >= result.space: - result.reserved = resize(result.space) + let r = resize(result.space) result = cast[NimString](growObj(result, - sizeof(TGenericSeq) + result.reserved + 1)) + sizeof(TGenericSeq) + r + 1)) + result.reserved = r result.data[result.len] = c result.data[result.len+1] = '\0' inc(result.len) @@ -218,26 +219,29 @@ proc incrSeq(seq: PGenericSeq, elemSize: int): PGenericSeq {.compilerProc.} = # seq[seq->len-1] = x; result = seq if result.len >= result.space: - result.reserved = resize(result.space) - result = cast[PGenericSeq](growObj(result, elemSize * result.reserved + + let r = resize(result.space) + result = cast[PGenericSeq](growObj(result, elemSize * r + GenericSeqSize)) + result.reserved = r inc(result.len) proc incrSeqV2(seq: PGenericSeq, elemSize: int): PGenericSeq {.compilerProc.} = # incrSeq version 2 result = seq if result.len >= result.space: - result.reserved = resize(result.space) - result = cast[PGenericSeq](growObj(result, elemSize * result.reserved + + let r = resize(result.space) + result = cast[PGenericSeq](growObj(result, elemSize * r + GenericSeqSize)) + result.reserved = r proc setLengthSeq(seq: PGenericSeq, elemSize, newLen: int): PGenericSeq {. compilerRtl.} = result = seq if result.space < newLen: - result.reserved = max(resize(result.space), newLen) - result = cast[PGenericSeq](growObj(result, elemSize * result.reserved + + let r = max(resize(result.space), newLen) + result = cast[PGenericSeq](growObj(result, elemSize * r + GenericSeqSize)) + result.reserved = r elif newLen < result.len: # we need to decref here, otherwise the GC leaks! when not defined(boehmGC) and not defined(nogc) and |