summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
authordata-man <datamanrb@gmail.com>2018-05-25 06:50:39 +0300
committerdata-man <datamanrb@gmail.com>2018-05-25 06:58:07 +0300
commit605b65487f97d53906ab4f4c7b2591b9ba8fc43e (patch)
tree74254c441d1dfac11dbf88d97ffa6b1f834a7096 /lib
parente206a8d95240e766474d601f529fef1c0026f80f (diff)
downloadNim-605b65487f97d53906ab4f4c7b2591b9ba8fc43e.tar.gz
Fixes #7877
Diffstat (limited to 'lib')
-rw-r--r--lib/pure/streams.nim14
1 files changed, 8 insertions, 6 deletions
diff --git a/lib/pure/streams.nim b/lib/pure/streams.nim
index 68922f730..f655a5cd7 100644
--- a/lib/pure/streams.nim
+++ b/lib/pure/streams.nim
@@ -88,16 +88,18 @@ proc readData*(s: Stream, buffer: pointer, bufLen: int): int =
 
 proc readAll*(s: Stream): string =
   ## Reads all available data.
-  const bufferSize = 1000
+  const bufferSize = 1024
   result = newString(bufferSize)
-  var r = 0
+  var buffer {.noinit.}: array[bufferSize, char]
   while true:
-    let readBytes = readData(s, addr(result[r]), bufferSize)
+    let readBytes = readData(s, addr(buffer[0]), bufferSize)
+    if readBytes == 0:
+      break
+    let prevLen = result.len
+    result.setLen(prevLen + readBytes)
+    copyMem(addr(result[prevLen]), addr(buffer[0]), readBytes)
     if readBytes < bufferSize:
-      setLen(result, r+readBytes)
       break
-    inc r, bufferSize
-    setLen(result, r+bufferSize)
 
 proc peekData*(s: Stream, buffer: pointer, bufLen: int): int =
   ## low level proc that reads data into an untyped `buffer` of `bufLen` size