diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2018-04-27 21:32:58 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2018-04-27 21:33:05 +0200 |
commit | 7c538b26ad03b077da84766771b85d72d978b598 (patch) | |
tree | 06630946771d4cf4e49b6a84c06c38721a021beb /lib | |
parent | c8a412998a5ca16a7f96c6f6d41061d976aa13b4 (diff) | |
download | Nim-7c538b26ad03b077da84766771b85d72d978b598.tar.gz |
nil in string concats does not produce crashes anymore
Diffstat (limited to 'lib')
-rw-r--r-- | lib/system/sysstr.nim | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/lib/system/sysstr.nim b/lib/system/sysstr.nim index 42aae6654..e64e12fc7 100644 --- a/lib/system/sysstr.nim +++ b/lib/system/sysstr.nim @@ -161,14 +161,16 @@ proc hashString(s: string): int {.compilerproc.} = proc addChar(s: NimString, c: char): NimString = # is compilerproc! - result = s - if result.len >= result.space: - let r = resize(result.space) - result = cast[NimString](growObj(result, - sizeof(TGenericSeq) + r + 1)) - result.reserved = r - elif wasMoved(s): - result = newOwnedString(s, s.len) + if s == nil: + result = rawNewStringNoInit(1) + result.len = 0 + else: + result = s + if result.len >= result.space: + let r = resize(result.space) + result = cast[NimString](growObj(result, + sizeof(TGenericSeq) + r + 1)) + result.reserved = r result.data[result.len] = c result.data[result.len+1] = '\0' inc(result.len) @@ -205,7 +207,9 @@ proc addChar(s: NimString, c: char): NimString = # s = rawNewString(0); proc resizeString(dest: NimString, addlen: int): NimString {.compilerRtl.} = - if dest.len + addlen <= dest.space and not wasMoved(dest): + if dest == nil: + result = rawNewStringNoInit(addlen) + elif dest.len + addlen <= dest.space and not wasMoved(dest): result = dest else: # slow path: var sp = max(resize(dest.space), dest.len + addlen) @@ -216,8 +220,9 @@ proc resizeString(dest: NimString, addlen: int): NimString {.compilerRtl.} = # DO NOT UPDATE LEN YET: dest.len = newLen proc appendString(dest, src: NimString) {.compilerproc, inline.} = - copyMem(addr(dest.data[dest.len]), addr(src.data), src.len + 1) - inc(dest.len, src.len) + if src != nil: + copyMem(addr(dest.data[dest.len]), addr(src.data), src.len + 1) + inc(dest.len, src.len) proc appendChar(dest: NimString, c: char) {.compilerproc, inline.} = dest.data[dest.len] = c |