]> Repositorios git - scryer-prolog.git/commitdiff
fix utf-8 panic
authorThierry Marianne <[email protected]>
Wed, 4 Mar 2026 11:03:21 +0000 (12:03 +0100)
committerThierry Marianne <[email protected]>
Wed, 4 Mar 2026 11:45:58 +0000 (12:45 +0100)
Signed-off-by: Thierry Marianne <[email protected]>
src/machine/system_calls.rs

index edd08cb5d9bc8bbacdeb11e8f1c2366e22ae2737..4b38c90b6a39aef6a21bfc1a7b718c3381be792f 100644 (file)
@@ -5125,10 +5125,29 @@ impl Machine {
                 unify!(self.machine_st, return_value, struct_value);
             }
             Value::CString(cstr) => {
-                let str_cell = resource_error_call_result!(
-                    self.machine_st,
-                    self.machine_st.heap.allocate_cstr(cstr.to_str().unwrap())
-                );
+                let bytes = cstr.to_bytes();
+
+                let str_cell = match std::str::from_utf8(bytes) {
+                    Ok(valid_str) => resource_error_call_result!(
+                        self.machine_st,
+                        self.machine_st.heap.allocate_cstr(valid_str)
+                    ),
+                    Err(_) => {
+                        let cells: Vec<_> = bytes
+                            .iter()
+                            .map(|&b| fixnum_as_cell!(Fixnum::build_with(b)))
+                            .collect();
+
+                        resource_error_call_result!(
+                            self.machine_st,
+                            sized_iter_to_heap_list(
+                                &mut self.machine_st.heap,
+                                cells.len(),
+                                cells.into_iter()
+                            )
+                        )
+                    }
+                };
 
                 unify!(self.machine_st, str_cell, return_value);
             }