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).} =