handle some error cases and replace unwrap with expect

This commit is contained in:
Bennet Bleßmann
2025-07-20 20:11:12 +02:00
committed by Bennet Bleßmann
parent 8971809c83
commit 43dd1587fb

View File

@@ -8414,17 +8414,20 @@ impl Machine {
// Var // Var
let pid_r = self.deref_register(8); let pid_r = self.deref_register(8);
let exe = self.machine_st.value_to_str_like(exe_r).unwrap(); let exe = self
.machine_st
.value_to_str_like(exe_r)
.expect("invalid values should have been rejected on the prolog side");
let args = self let args = self
.machine_st .machine_st
.try_from_list(args_r, stub_gen) .try_from_list(args_r, stub_gen)
.unwrap() .expect("invalid values should have been rejected on the prolog side")
.into_iter() .into_iter()
.map(|arg| { .map(|arg| {
self.machine_st self.machine_st
.value_to_str_like(arg) .value_to_str_like(arg)
.unwrap() .expect("invalid values should have been rejected on the prolog side")
.as_str() .as_str()
.to_string() .to_string()
}) })
@@ -8456,20 +8459,23 @@ impl Machine {
let name = self let name = self
.machine_st .machine_st
.value_to_str_like(entry[0]) .value_to_str_like(entry[0])
.unwrap() .expect("invalid values should have been rejected on the prolog side")
.as_str() .as_str()
.to_string(); .to_string();
let value = self let value = self
.machine_st .machine_st
.value_to_str_like(entry[1]) .value_to_str_like(entry[1])
.unwrap() .expect("invalid values should have been rejected on the prolog side")
.as_str() .as_str()
.to_string(); .to_string();
Ok((name, value)) Ok((name, value))
}) })
.collect::<Result<Vec<_>, MachineStub>>()?; .collect::<Result<Vec<_>, MachineStub>>()?;
let cwd = self.machine_st.value_to_str_like(cwd_r).unwrap(); let cwd = self
.machine_st
.value_to_str_like(cwd_r)
.expect("invalid values should have been rejected on the prolog side");
let mut command = std::process::Command::new(&*exe.as_str()); let mut command = std::process::Command::new(&*exe.as_str());
command.args(args); command.args(args);
@@ -8492,16 +8498,20 @@ impl Machine {
Ok(child) => { Ok(child) => {
let pid = child.id(); let pid = child.id();
self.machine_st.bind( self.machine_st.bind(
pid_r.as_var().unwrap(), pid_r
.as_var()
.expect("invalid values should have been rejected on the prolog side"),
fixnum_as_cell!(Fixnum::build_with(pid)), fixnum_as_cell!(Fixnum::build_with(pid)),
); );
Ok(()) Ok(())
} }
Err(err) => { Err(_) => {
// TODO give better error indication let perm_error = self.machine_st.permission_error(
dbg!(err); Permission::Create,
self.machine_st.fail = true; atom!("process"),
Ok(()) stub_gen(),
);
Err(self.machine_st.error_form(perm_error, stub_gen()))
} }
} }
} }
@@ -8511,8 +8521,16 @@ impl Machine {
Some(atom!("std")) => Stdio::inherit(), Some(atom!("std")) => Stdio::inherit(),
Some(atom!("null")) => Stdio::null(), Some(atom!("null")) => Stdio::null(),
Some(atom!("pipe")) => { Some(atom!("pipe")) => {
// TODO handler Err let (reader, writer) = match std::io::pipe() {
let (reader, writer) = std::io::pipe().unwrap(); Ok(pipe_pair) => pipe_pair,
Err(_) => {
return Err(self.machine_st.open_permission_error(
atom!("anonymous_pipe"),
atom!("process_create"),
3,
));
}
};
let stream = Stream::from_pipe_reader(reader, &mut self.machine_st.arena); let stream = Stream::from_pipe_reader(reader, &mut self.machine_st.arena);
@@ -8528,12 +8546,20 @@ impl Machine {
Some(atom!("file")) => { Some(atom!("file")) => {
let path = self.machine_st.value_to_str_like(args[1]).unwrap(); let path = self.machine_st.value_to_str_like(args[1]).unwrap();
// TODO handler Err let file = match std::fs::File::open(&*path.as_str()) {
let file = std::fs::File::open(&*path.as_str()).unwrap(); Ok(file) => file,
Err(_) => {
return Err(self.machine_st.open_permission_error(
args[1],
atom!("process_create"),
3,
));
}
};
Stdio::from(file) Stdio::from(file)
} }
_ => { _ => {
panic!("Invalid stdin tag") panic!("Invalid stdout tag")
} }
}) })
} }
@@ -8543,8 +8569,16 @@ impl Machine {
Some(atom!("std")) => Stdio::inherit(), Some(atom!("std")) => Stdio::inherit(),
Some(atom!("null")) => Stdio::null(), Some(atom!("null")) => Stdio::null(),
Some(atom!("pipe")) => { Some(atom!("pipe")) => {
// TODO handler Err let (reader, writer) = match std::io::pipe() {
let (reader, writer) = std::io::pipe().unwrap(); Ok(pipe_pair) => pipe_pair,
Err(_) => {
return Err(self.machine_st.open_permission_error(
atom!("anonymous_pipe"),
atom!("process_create"),
3,
));
}
};
let stream = Stream::from_pipe_writer(writer, &mut self.machine_st.arena); let stream = Stream::from_pipe_writer(writer, &mut self.machine_st.arena);
@@ -8560,8 +8594,16 @@ impl Machine {
Some(atom!("file")) => { Some(atom!("file")) => {
let path = self.machine_st.value_to_str_like(args[1]).unwrap(); let path = self.machine_st.value_to_str_like(args[1]).unwrap();
// TODO handler Err let file = match std::fs::File::open(&*path.as_str()) {
let file = std::fs::File::open(&*path.as_str()).unwrap(); Ok(file) => file,
Err(_) => {
return Err(self.machine_st.open_permission_error(
args[1],
atom!("process_create"),
3,
));
}
};
Stdio::from(file) Stdio::from(file)
} }
_ => { _ => {