summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--lib/pure/streams.nim5
-rw-r--r--tests/stdlib/tstreams.nim10
2 files changed, 15 insertions, 0 deletions
diff --git a/lib/pure/streams.nim b/lib/pure/streams.nim
index f58273ee8..50b3085d2 100644
--- a/lib/pure/streams.nim
+++ b/lib/pure/streams.nim
@@ -1197,6 +1197,11 @@ else: # after 1.3 or JS not defined
 
   proc ssReadDataStr(s: Stream, buffer: var string, slice: Slice[int]): int =
     var s = StringStream(s)
+    when nimvm:
+      discard
+    else:
+      when declared(prepareMutation):
+        prepareMutation(buffer) # buffer might potentially be a CoW literal with ARC
     result = min(slice.b + 1 - slice.a, s.data.len - s.pos)
     if result > 0:
       jsOrVmBlock:
diff --git a/tests/stdlib/tstreams.nim b/tests/stdlib/tstreams.nim
index d9857926e..cc1343651 100644
--- a/tests/stdlib/tstreams.nim
+++ b/tests/stdlib/tstreams.nim
@@ -85,3 +85,13 @@ block:
 static: # Ensure streams it doesnt break with nimscript on arc/orc #19716
   let s = newStringStream("a")
   doAssert s.data == "a"
+
+template main =
+  var strm = newStringStream("abcde")
+  var buffer = "12345"
+  doAssert strm.readDataStr(buffer, 0..3) == 4
+  doAssert buffer == "abcd5"
+  strm.close()
+
+static: main()
+main()