Skip to content

Commit

Permalink
followup of #22568 (#22690)
Browse files Browse the repository at this point in the history
  • Loading branch information
AmjadHD authored Sep 14, 2023
1 parent 96e1949 commit 38b5823
Showing 1 changed file with 17 additions and 24 deletions.
41 changes: 17 additions & 24 deletions lib/system/sysstr.nim
Original file line number Diff line number Diff line change
Expand Up @@ -47,41 +47,33 @@ else:
template allocStrNoInit(size: untyped): untyped =
cast[NimString](newObjNoInit(addr(strDesc), size))

proc rawNewStringNoInit(space: int): NimString {.compilerproc.} =
var s = space
if s < 7: s = 7
proc rawNewStringNoInit(space: int): NimString =
let s = max(space, 7)
result = allocStrNoInit(sizeof(TGenericSeq) + s + 1)
result.reserved = s
result.len = 0
when defined(gogc):
result.elemSize = 1

proc rawNewString(space: int): NimString {.compilerproc.} =
var s = space
if s < 7: s = 7
result = allocStr(sizeof(TGenericSeq) + s + 1)
result.reserved = s
result = rawNewStringNoInit(space)
result.len = 0
when defined(gogc):
result.elemSize = 1
result.data[0] = '\0'

proc mnewString(len: int): NimString {.compilerproc.} =
result = rawNewString(len)
result = rawNewStringNoInit(len)
result.len = len
zeroMem(addr result.data[0], len + 1)

proc copyStrLast(s: NimString, start, last: int): NimString {.compilerproc.} =
# This is not used by most recent versions of the compiler anymore, but
# required for bootstrapping purposes.
let start = max(start, 0)
if s == nil: return nil
let len = min(last, s.len-1) - start + 1
if len > 0:
result = rawNewStringNoInit(len)
result.len = len
copyMem(addr(result.data), addr(s.data[start]), len)
result.data[len] = '\0'
else:
result = rawNewString(len)
result = rawNewStringNoInit(len)
result.len = len
copyMem(addr(result.data), addr(s.data[start]), len)
result.data[len] = '\0'

proc copyStr(s: NimString, start: int): NimString {.compilerproc.} =
# This is not used by most recent versions of the compiler anymore, but
Expand All @@ -96,7 +88,8 @@ proc nimToCStringConv(s: NimString): cstring {.compilerproc, nonReloadable, inli
proc toNimStr(str: cstring, len: int): NimString {.compilerproc.} =
result = rawNewStringNoInit(len)
result.len = len
copyMem(addr(result.data), str, len + 1)
copyMem(addr(result.data), str, len)
result.data[len] = '\0'

proc cstrToNimstr(str: cstring): NimString {.compilerRtl.} =
if str == nil: NimString(nil)
Expand Down Expand Up @@ -201,7 +194,7 @@ proc addChar(s: NimString, c: char): NimString =

proc resizeString(dest: NimString, addlen: int): NimString {.compilerRtl.} =
if dest == nil:
result = rawNewStringNoInit(addlen)
result = rawNewString(addlen)
elif dest.len + addlen <= dest.space:
result = dest
else: # slow path:
Expand All @@ -227,15 +220,15 @@ proc appendChar(dest: NimString, c: char) {.compilerproc, inline.} =
proc setLengthStr(s: NimString, newLen: int): NimString {.compilerRtl.} =
let n = max(newLen, 0)
if s == nil:
result = mnewString(newLen)
result = mnewString(n)
elif n <= s.space:
result = s
else:
let sp = max(resize(s.space), newLen)
let sp = max(resize(s.space), n)
result = rawNewStringNoInit(sp)
result.len = s.len
copyMem(addr result.data[0], unsafeAddr(s.data[0]), s.len+1)
zeroMem(addr result.data[s.len], newLen - s.len)
copyMem(addr result.data[0], unsafeAddr(s.data[0]), s.len)
zeroMem(addr result.data[s.len], n - s.len)
result.reserved = sp
result.len = n
result.data[n] = '\0'
Expand Down

0 comments on commit 38b5823

Please sign in to comment.