.stderr(stderr);
match command.spawn() {
- #[cfg_attr(rust_version = "1.87.0", expect(unused_mut))]
- Ok(mut child) => {
- #[cfg(not(rust_version = "1.87.0"))]
- {
- self.anon_pipe_compat(&mut child, &stdin_args, &stdout_args, &stderr_args)?;
- }
-
+ Ok(child) => {
let child_process_alloc: TypedArenaPtr<Child> =
arena_alloc!(child, &mut self.machine_st.arena);
}
}
- #[cfg(not(rust_version = "1.87.0"))]
- fn anon_pipe_compat(
- &mut self,
- child: &mut std::process::Child,
- stdin_args: &[HeapCellValue],
- stdout_args: &[HeapCellValue],
- stderr_args: &[HeapCellValue],
- ) -> CallResult {
- if let Some(atom!("pipe")) = stdin_args[0].to_atom() {
- let writer = child.stdin.take().expect("Should have captured stdin");
-
- let stream = Stream::from_pipe_writer(writer, &mut self.machine_st.arena);
-
- self.indices
- .add_stream(stream, atom!("process_create"), 3)
- .map_err(|stub_gen| stub_gen(&mut self.machine_st))?;
-
- unify!(self.machine_st, stdin_args[1], HeapCellValue::from(stream));
- }
-
- if let Some(atom!("pipe")) = stdout_args[0].to_atom() {
- let writer = child.stdout.take().expect("Should have captured stdout");
-
- let stream = Stream::from_pipe_reader(
- PipeReader(PipeReaderInner::Stdout(writer)),
- &mut self.machine_st.arena,
- );
-
- self.indices
- .add_stream(stream, atom!("process_create"), 3)
- .map_err(|stub_gen| stub_gen(&mut self.machine_st))?;
-
- unify!(self.machine_st, stdout_args[1], HeapCellValue::from(stream));
- }
-
- if let Some(atom!("pipe")) = stderr_args[0].to_atom() {
- let writer = child.stderr.take().expect("Should have captured stderr");
-
- let stream = Stream::from_pipe_reader(
- PipeReader(PipeReaderInner::Stderr(writer)),
- &mut self.machine_st.arena,
- );
-
- self.indices
- .add_stream(stream, atom!("process_create"), 3)
- .map_err(|stub_gen| stub_gen(&mut self.machine_st))?;
-
- unify!(self.machine_st, stderr_args[1], HeapCellValue::from(stream));
- }
-
- Ok(())
- }
-
fn handle_output_stream(&mut self, args: &[HeapCellValue]) -> Result<Stdio, MachineStub> {
Ok(match args[0].to_atom() {
Some(atom!("std")) => Stdio::inherit(),
Some(atom!("null")) => Stdio::null(),
Some(atom!("pipe")) => {
- #[cfg(rust_version = "1.87.0")]
- #[allow(clippy::incompatible_msrv)]
- {
- let (reader, writer) = match std::io::pipe() {
- 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 (reader, writer) = match std::io::pipe() {
+ Ok(pipe_pair) => pipe_pair,
+ Err(_) => {
+ return Err(self.machine_st.open_permission_error(
+ atom!("anonymous_pipe"),
+ atom!("process_create"),
+ 3,
+ ));
+ }
+ };
- self.indices
- .add_stream(stream, atom!("process_create"), 3)
- .map_err(|stub_gen| stub_gen(&mut self.machine_st))?;
+ let stream = Stream::from_pipe_reader(reader, &mut self.machine_st.arena);
- self.machine_st
- .bind(args[1].as_var().unwrap(), stream.into());
+ self.indices
+ .add_stream(stream, atom!("process_create"), 3)
+ .map_err(|stub_gen| stub_gen(&mut self.machine_st))?;
- Stdio::from(writer)
- }
+ self.machine_st
+ .bind(args[1].as_var().unwrap(), stream.into());
- #[cfg(not(rust_version = "1.87.0"))]
- {
- Stdio::piped()
- }
+ Stdio::from(writer)
}
Some(atom!("file")) => {
let path = self.machine_st.value_to_str_like(args[1]).unwrap();