diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2020-02-21 21:06:41 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-21 21:06:41 +0100 |
commit | 0d219d2c67cdf123fbc38aade3974edef5ee9f8b (patch) | |
tree | c846e32ccfca6f52580e08f7e4a0b075484252b4 /lib | |
parent | e05aca8734702f0ad4beb0625780d354d7168bc7 (diff) | |
download | Nim-0d219d2c67cdf123fbc38aade3974edef5ee9f8b.tar.gz |
fixes #13457 (#13458)
Diffstat (limited to 'lib')
-rw-r--r-- | lib/system/strs_v2.nim | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/lib/system/strs_v2.nim b/lib/system/strs_v2.nim index 6f28ad237..3beb14382 100644 --- a/lib/system/strs_v2.nim +++ b/lib/system/strs_v2.nim @@ -38,14 +38,13 @@ proc resize(old: int): int {.inline.} = proc prepareAdd(s: var NimStringV2; addlen: int) {.compilerRtl.} = if isLiteral(s): - if addlen > 0: - let oldP = s.p - # can't mutate a literal, so we need a fresh copy here: - s.p = cast[ptr NimStrPayload](allocShared0(contentSize(s.len + addlen))) - s.p.cap = s.len + addlen - if s.len > 0: - # we are about to append, so there is no need to copy the \0 terminator: - copyMem(unsafeAddr s.p.data[0], unsafeAddr oldP.data[0], s.len) + let oldP = s.p + # can't mutate a literal, so we need a fresh copy here: + s.p = cast[ptr NimStrPayload](allocShared0(contentSize(s.len + addlen))) + s.p.cap = s.len + addlen + if s.len > 0: + # we are about to append, so there is no need to copy the \0 terminator: + copyMem(unsafeAddr s.p.data[0], unsafeAddr oldP.data[0], s.len) else: let oldCap = s.p.cap and not strlitFlag if s.len + addlen > oldCap: @@ -110,8 +109,10 @@ proc setLengthStrV2(s: var NimStringV2, newLen: int) {.compilerRtl.} = if newLen == 0: frees(s) s.p = nil - elif newLen > s.len or isLiteral(s): - prepareAdd(s, newLen - s.len) + else: + if newLen > s.len or isLiteral(s): + prepareAdd(s, newLen - s.len) + s.p.data[newLen] = '\0' s.len = newLen proc nimAsgnStrV2(a: var NimStringV2, b: NimStringV2) {.compilerRtl.} = |