diff options
author | metagn <metagngn@gmail.com> | 2024-09-04 10:25:01 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-04 09:25:01 +0200 |
commit | 080b0a03bd724ea50c5b90553c0aedc47be56a5e (patch) | |
tree | 1c5efc4db60fe9d566384d2bde45fbcbb50de81e | |
parent | c314155fb37ef7dbd8a7de0df7e8b9d9b61f4802 (diff) | |
download | Nim-080b0a03bd724ea50c5b90553c0aedc47be56a5e.tar.gz |
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.
-rw-r--r-- | lib/pure/streams.nim | 15 | ||||
-rw-r--r-- | testament/important_packages.nim | 2 | ||||
-rw-r--r-- | tests/stdlib/tstreams.nim | 4 |
3 files changed, 17 insertions, 4 deletions
diff --git a/lib/pure/streams.nim b/lib/pure/streams.nim index 8ae7fb3c1..56f49d7b1 100644 --- a/lib/pure/streams.nim +++ b/lib/pure/streams.nim @@ -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).} = diff --git a/testament/important_packages.nim b/testament/important_packages.nim index 8ac28df10..efec04b3c 100644 --- a/testament/important_packages.nim +++ b/testament/important_packages.nim @@ -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 diff --git a/tests/stdlib/tstreams.nim b/tests/stdlib/tstreams.nim index 0668d12bd..60c63b450 100644 --- a/tests/stdlib/tstreams.nim +++ b/tests/stdlib/tstreams.nim @@ -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" |