streams: implement readStr for VM, document VM limitations (#24058)

fixes #24054

`readData` is not implemented for the VM as mentioned in the issue, but
`readDataStr` is, so that is used for `readStr` instead on the VM. We
could also just use it in general since it falls back to `readData`
anyway but it's kept the same otherwise for now.

Also where and why streams in general don't work in VM is now documented
on the top level `streams` module documentation.
This commit is contained in:
metagn
2024-09-04 10:25:01 +03:00
committed by GitHub
parent c314155fb3
commit 080b0a03bd
3 changed files with 17 additions and 4 deletions

View File

@@ -15,6 +15,11 @@
## Other modules may provide other implementations for this standard
## stream interface.
##
## .. warning:: Due to the use of `pointer`, the `readData`, `peekData` and
## `writeData` interfaces are not available on the compile-time VM, and must
## be cast from a `ptr string` on the JS backend. However, `readDataStr` is
## available generally in place of `readData`.
##
## Basic usage
## ===========
##
@@ -938,10 +943,14 @@ proc peekFloat64*(s: Stream): float64 =
proc readStrPrivate(s: Stream, length: int, str: var string) =
if length > len(str): setLen(str, length)
when defined(js):
let L = readData(s, addr(str), length)
var L: int
when nimvm:
L = readDataStr(s, str, 0..length-1)
else:
let L = readData(s, cstring(str), length)
when defined(js):
L = readData(s, addr(str), length)
else:
L = readData(s, cstring(str), length)
if L != len(str): setLen(str, L)
proc readStr*(s: Stream, length: int, str: var string) {.since: (1, 3).} =

View File

@@ -181,7 +181,7 @@ pkg "unicodeplus", "nim c -d:release -r tests/tests.nim"
pkg "union", "nim c -r tests/treadme.nim", url = "https://github.com/alaviss/union"
pkg "unittest2"
pkg "unpack"
pkg "weave", "nimble install cligen@#HEAD; nimble test_gc_arc", useHead = true
pkg "weave", "nimble install -y cligen@#HEAD; nimble test_gc_arc", useHead = true
pkg "websock"
pkg "websocket", "nim c websocket.nim"
# pkg "winim", allowFailure = true

View File

@@ -92,6 +92,10 @@ static: # Ensure streams it doesnt break with nimscript on arc/orc #19716
let s = newStringStream("a")
doAssert s.data == "a"
static: # issue #24054, readStr
var s = newStringStream("foo bar baz")
doAssert s.readStr(3) == "foo"
template main =
var strm = newStringStream("abcde")
var buffer = "12345"