@@ -156,7 +156,6 @@ proc addChar(s: NimString, c: char): NimString =
156156 result = rawNewStringNoInit (r)
157157 result .len = s.len
158158 copyMem (addr result .data[0 ], unsafeAddr (s.data[0 ]), s.len+ 1 )
159- result .reserved = r
160159 result .data[result .len] = c
161160 result .data[result .len+ 1 ] = '\0 '
162161 inc (result .len)
@@ -202,7 +201,6 @@ proc resizeString(dest: NimString, addlen: int): NimString {.compilerRtl.} =
202201 result = rawNewStringNoInit (sp)
203202 result .len = dest.len
204203 copyMem (addr result .data[0 ], unsafeAddr (dest.data[0 ]), dest.len+ 1 )
205- result .reserved = sp
206204 # result = rawNewString(sp)
207205 # copyMem(result, dest, dest.len + sizeof(TGenericSeq))
208206 # DO NOT UPDATE LEN YET: dest.len = newLen
@@ -220,22 +218,42 @@ proc appendChar(dest: NimString, c: char) {.compilerproc, inline.} =
220218proc setLengthStr (s: NimString , newLen: int ): NimString {.compilerRtl .} =
221219 let n = max (newLen, 0 )
222220 if s == nil :
223- if n == 0 :
224- return s
225- else :
226- result = mnewString (n)
221+ return if n == 0 : s else : mnewString (n)
227222 elif n <= s.space:
228223 result = s
229224 else :
230225 let sp = max (resize (s.space), n)
231226 result = rawNewStringNoInit (sp)
232- result .len = s.len
233227 copyMem (addr result .data[0 ], unsafeAddr (s.data[0 ]), s.len)
234228 zeroMem (addr result .data[s.len], n - s.len)
235- result .reserved = sp
236229 result .len = n
237230 result .data[n] = '\0 '
238231
232+ proc setLengthStrUninit (s: var string , newlen: Natural ) {.nodestroy .} =
233+ # # Sets the `s` length to `newlen` without zeroing memory on growth.
234+ # # Terminating zero for cstring compatibility is set.
235+ var str = cast [NimString ](s.unsafeAddr)
236+ let n = max (newLen, 0 )
237+ if str == nil :
238+ if n == 0 : return
239+ else :
240+ str = rawNewStringNoInit (n)
241+ str.data[n] = '\0 '
242+ str.len = n
243+ s = cast [string ](str)
244+ else :
245+ if n > str.space:
246+ let sp = max (resize (str.space), n)
247+ str = rawNewStringNoInit (sp)
248+ copyMem (addr str.data[0 ], unsafeAddr s[0 ], s.len)
249+ str.data[n] = '\0 '
250+ str.len = n
251+ s = cast [string ](str)
252+ elif n < s.len:
253+ str.data[n] = '\0 '
254+ str.len = n
255+ else : return
256+
239257# ----------------- sequences ----------------------------------------------
240258
241259proc incrSeq (seq: PGenericSeq , elemSize, elemAlign: int ): PGenericSeq {.compilerproc .} =
0 commit comments