Skip to content

Commit 100f98f

Browse files
committed
rsscript: add bytes to string intrinsic
1 parent eee3feb commit 100f98f

6 files changed

Lines changed: 17 additions & 0 deletions

File tree

crates/rsscript/src/reg_vm/mod.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1978,6 +1978,7 @@ enum RegIntrinsic {
19781978
BytesIsEmpty,
19791979
BytesLen,
19801980
BytesSlice,
1981+
BytesToString,
19811982
BytesToUints,
19821983
BytesViewStartsWith,
19831984
BytesViewToBytes,
@@ -3930,6 +3931,7 @@ impl RegLowerer<'_> {
39303931
("Bytes", "is_empty") => RegIntrinsic::BytesIsEmpty,
39313932
("Bytes", "len") => RegIntrinsic::BytesLen,
39323933
("Bytes", "slice") | ("Bytes", "view") => RegIntrinsic::BytesSlice,
3934+
("Bytes", "to_string") => RegIntrinsic::BytesToString,
39333935
("Bytes", "to_uints") => RegIntrinsic::BytesToUints,
39343936
("Buffer", "clear") => {
39353937
if arg_regs.len() != 1 {
@@ -8824,6 +8826,10 @@ impl RegVm {
88248826
let len = expect_int_ref(intrinsic_arg(&self.stack, base, args, 2)?)?;
88258827
Ok(VmValue::Bytes(Rc::new(bytes_slice(value, start, len))))
88268828
}
8829+
RegIntrinsic::BytesToString => {
8830+
let value = expect_bytes_ref(intrinsic_arg(&self.stack, base, args, 0)?)?;
8831+
Ok(VmValue::string(String::from_utf8_lossy(value)))
8832+
}
88278833
RegIntrinsic::BytesToUints => {
88288834
let value = expect_bytes_ref(intrinsic_arg(&self.stack, base, args, 0)?)?;
88298835
Ok(VmValue::List(Rc::new(RefCell::new(

crates/rsscript/src/runtime_abi.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ const RUNTIME_INTRINSICS: &[RuntimeIntrinsic] = &[
167167
runtime_intrinsic("Bytes", "is_empty", "rsscript_runtime::bytes_is_empty"),
168168
runtime_intrinsic("Bytes", "len", "rsscript_runtime::bytes_len"),
169169
runtime_intrinsic("Bytes", "slice", "rsscript_runtime::bytes_slice"),
170+
runtime_intrinsic("Bytes", "to_string", "rsscript_runtime::bytes_to_string"),
170171
runtime_intrinsic("Bytes", "to_uints", "rsscript_runtime::bytes_to_uints"),
171172
runtime_intrinsic("Bytes", "view", "rsscript_runtime::bytes_view"),
172173
runtime_intrinsic(

crates/rsscript/tests/checker_lowering/stdlib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -844,6 +844,7 @@ fn main() -> Result<Unit, MyError> {
844844
let bytes_len = Bytes.len(value: read joined)
845845
let bytes_empty = Bytes.is_empty(value: read joined)
846846
let bytes_slice = Bytes.slice(value: read joined, start: 1, len: 2)
847+
let bytes_text = Bytes.to_string(value: read bytes_slice)
847848
848849
let buffer = Buffer.new(size: 16)
849850
let buffer_len = Buffer.len(buffer: read buffer)
@@ -1365,6 +1366,7 @@ fn inspect_file(path: read Path, bytes: read Bytes) -> Result<String, FileError>
13651366
let exists = Directory.exists(path: read path)
13661367
let metadata = Directory.metadata(path: read path)?
13671368
let length = metadata_len(metadata: read metadata)
1369+
let byte_text = Bytes.to_string(value: read bytes)
13681370
let text = Directory.read_string(path: read path)?
13691371
Directory.write_string(path: read path, content: read text)?
13701372
let file_hash = Hash.sha256_file(path: read path)?
@@ -1414,6 +1416,7 @@ fn fetch_status(url: read Url) -> Result<Int, HttpError> {
14141416
assert!(rust.contains("rsscript_runtime::directory_write_string(path, &(text))?;"));
14151417
assert!(rust.contains("let file_hash = rsscript_runtime::hash_sha256_file(path)?;"));
14161418
assert!(rust.contains("let byte_hash = rsscript_runtime::hash_sha256_bytes(bytes);"));
1419+
assert!(rust.contains("let byte_text = rsscript_runtime::bytes_to_string(bytes);"));
14171420
assert!(rust.contains("let current = rsscript_runtime::env_current_dir()?;"));
14181421
assert!(rust.contains("let run_root = rsscript_runtime::env_run_workspace_root();"));
14191422
assert!(rust.contains("rsscript_runtime::env_set_current_dir(&(current))?;"));

crates/rsscript/tests/vm/strings.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ fn main() -> Unit {
134134
135135
let part = Bytes.slice(value: read joined, start: 2, len: 3)
136136
Log.write(message: read String.from_int(value: Bytes.len(value: read part)))
137+
Log.write(message: read Bytes.to_string(value: read part))
137138
138139
let view = Bytes.view(value: read joined, start: 1, len: 4)
139140
Log.write(message: read String.from_int(value: BytesView.len(value: read view)))

crates/runtime/src/collections.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -891,6 +891,10 @@ pub fn bytes_to_uints(value: &[u8]) -> Vec<i64> {
891891
value.iter().map(|byte| i64::from(*byte)).collect()
892892
}
893893

894+
pub fn bytes_to_string(value: &[u8]) -> String {
895+
String::from_utf8_lossy(value).to_string()
896+
}
897+
894898
pub fn bytes_from_buffer(buffer: &[u8]) -> Vec<u8> {
895899
buffer.to_vec()
896900
}

stdlib/collections/bytes.rssi

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ pub fn Bytes.from_uints(values: read List<Int>) -> fresh Bytes
1010

1111
pub fn Bytes.to_uints(value: read Bytes) -> fresh List<Int>
1212

13+
pub fn Bytes.to_string(value: read Bytes) -> fresh String
14+
1315
pub fn Bytes.len(value: read Bytes) -> Int
1416

1517
pub fn Bytes.is_empty(value: read Bytes) -> Bool

0 commit comments

Comments
 (0)