summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorDanil Yarantsev <tiberiumk12@gmail.com>2022-04-25 12:15:03 +0300
committerGitHub <noreply@github.com>2022-04-25 11:15:03 +0200
commit2f32b450d39030c287df4d56be9d06473772f5cd (patch)
tree4c634f5ab10090c3961f12fa1b301eb74e127f87
parentefaa6777a464b94d88cb948390397b490ccee5b8 (diff)
downloadNim-2f32b450d39030c287df4d56be9d06473772f5cd.tar.gz
Really fix StringStream with ARC at compile-time, improve streams test (#19739)
* Fix compile-time StringStream with ARC

* make readDataStr work with ARC, improve test
-rw-r--r--lib/pure/streams.nim10
-rw-r--r--tests/stdlib/tstreams.nim9
2 files changed, 15 insertions, 4 deletions
diff --git a/lib/pure/streams.nim b/lib/pure/streams.nim
index 2ac6a82f1..f58273ee8 100644
--- a/lib/pure/streams.nim
+++ b/lib/pure/streams.nim
@@ -243,6 +243,9 @@ proc readDataStr*(s: Stream, buffer: var string, slice: Slice[int]): int =
     result = s.readDataStrImpl(s, buffer, slice)
   else:
     # fallback
+    when declared(prepareMutation):
+      # buffer might potentially be a CoW literal with ARC
+      prepareMutation(buffer)
     result = s.readData(addr buffer[slice.a], slice.b + 1 - slice.a)
 
 template jsOrVmBlock(caseJsOrVm, caseElse: untyped): untyped =
@@ -1274,8 +1277,11 @@ else: # after 1.3 or JS not defined
 
     new(result)
     result.data = s
-    when declared(prepareMutation):
-      prepareMutation(result.data) # Allows us to mutate using `addr` logic like `copyMem`, otherwise it errors.
+    when nimvm:
+      discard
+    else:
+      when declared(prepareMutation):
+        prepareMutation(result.data) # Allows us to mutate using `addr` logic like `copyMem`, otherwise it errors.
     result.pos = 0
     result.closeImpl = ssClose
     result.atEndImpl = ssAtEnd
diff --git a/tests/stdlib/tstreams.nim b/tests/stdlib/tstreams.nim
index 6fda30f51..d9857926e 100644
--- a/tests/stdlib/tstreams.nim
+++ b/tests/stdlib/tstreams.nim
@@ -1,4 +1,5 @@
 discard """
+  matrix: "--gc:refc; --gc:arc"
   input: "Arne"
   output: '''
 Hello! What is your name?
@@ -74,9 +75,13 @@ block:
   doAssert(ss.peekLine(str))
   doAssert(str == "uick brown fox jumped over the lazy dog.")
   doAssert(ss.getPosition == 5) # haven't moved
-  ss.setPosition(0) # Ensure we dont error with writing over literals on arc/orc #19707
+  # bug #19707 - Ensure we dont error with writing over literals on arc/orc
+  ss.setPosition(0)
   ss.write("hello")
+  ss.setPosition(0)
+  doAssert(ss.peekStr(5) == "hello")
 
+# bug #19716
 static: # Ensure streams it doesnt break with nimscript on arc/orc #19716
   let s = newStringStream("a")
-  discard s.data
+  doAssert s.data == "a"