Merge pull request #6158 from roc-lang/expect-seamless-slice

Support seamless slice in expects
This commit is contained in:
Brendan Hansknecht 2023-12-02 17:37:35 -08:00 committed by GitHub
commit 6dddb7b348
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 14 additions and 8 deletions

View File

@ -554,13 +554,13 @@ mod cli_run {
r#"
This expectation failed:
18 expect x != x
^^^^^^
19 expect words == []
^^^^^^^^^^^
When it failed, these variables had these values:
x : Num *
x = 42
words : List Str
words = ["this", "will", "for", "sure", "be", "a", "large", "string", "so", "when", "we", "split", "it", "it", "will", "use", "seamless", "slices", "which", "affect", "printing"]
[#UserApp] 42
[#UserApp] "Fjoer en ferdjer frieten oan dyn geve lea"

View File

@ -4,8 +4,8 @@ libapp.so
dynhost
preprocessedhost
metadata
expects
expects/expects
benchmarks/rbtree-ck
benchmarks/rbtree-insert
benchmarks/test-astar

View File

@ -14,8 +14,11 @@ polyDbg = \x ->
x
main =
str = "this will for sure be a large string so when we split it it will use seamless slices which affect printing"
words = Str.split str " "
expect words == []
x = 42
expect x != x
dbg x
dbg "Fjoer en ferdjer frieten oan dyn geve lea"

View File

@ -59,7 +59,9 @@ impl ReplAppMemory for ExpectMemory {
roc_str.as_str()
} else {
let offset = self.deref_usize(addr);
let length = self.deref_usize(addr + std::mem::size_of::<usize>());
let seamless_slice_mask = usize::MAX >> 1;
let length =
self.deref_usize(addr + std::mem::size_of::<usize>()) & seamless_slice_mask;
let _capacity = self.deref_usize(addr + 2 * std::mem::size_of::<usize>());
unsafe {

View File

@ -87,7 +87,8 @@ impl<'a> ReplAppMemory for WasmMemory<'a> {
&self.copied_bytes[addr..][..len]
} else {
let chars_index = self.deref_usize(addr);
let len = self.deref_usize(addr + 4);
let seamless_slice_mask = u32::MAX as usize >> 1;
let len = self.deref_usize(addr + 4) & seamless_slice_mask;
&self.copied_bytes[chars_index..][..len]
};