summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
authorArchs <sun@archs.tk>2015-03-01 00:33:40 +0800
committerArchs <sun@archs.tk>2015-03-01 00:33:40 +0800
commitf9b2f9565cb87efd16cb40a998a50f7c6780c6e8 (patch)
tree67c7b138494b28e618decddb3065161172911ede /lib
parent549920a85f426fe7eaedafa68d29e04227997c5e (diff)
downloadNim-f9b2f9565cb87efd16cb40a998a50f7c6780c6e8.tar.gz
streams.ssWriteData: calling setLen only when new data truely increases the underlying string buffer
Diffstat (limited to 'lib')
-rw-r--r--lib/pure/streams.nim8
1 files changed, 5 insertions, 3 deletions
diff --git a/lib/pure/streams.nim b/lib/pure/streams.nim
index 67c80e592..1ba0fb9aa 100644
--- a/lib/pure/streams.nim
+++ b/lib/pure/streams.nim
@@ -224,10 +224,12 @@ proc ssReadData(s: Stream, buffer: pointer, bufLen: int): int =
 
 proc ssWriteData(s: Stream, buffer: pointer, bufLen: int) = 
   var s = StringStream(s)
-  if bufLen > 0: 
+  if bufLen <= 0:
+    return
+  if s.pos + bufLen > s.data.len():
     setLen(s.data, s.data.len + bufLen)
-    copyMem(addr(s.data[s.pos]), buffer, bufLen)
-    inc(s.pos, bufLen)
+  copyMem(addr(s.data[s.pos]), buffer, bufLen)
+  inc(s.pos, bufLen)
 
 proc ssClose(s: Stream) =
   var s = StringStream(s)