From b3239abea188deb0fa032aa44b494f1a6d19d506 Mon Sep 17 00:00:00 2001 From: Mark Date: Thu, 21 Sep 2023 14:36:53 -0600 Subject: [PATCH] throw resource error if OpenOptions raises an error of uncategorized kind (#1375) --- src/machine/machine_errors.rs | 26 +++++++++++++++++++++----- src/machine/streams.rs | 9 ++++----- src/machine/system_calls.rs | 2 +- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/machine/machine_errors.rs b/src/machine/machine_errors.rs index 279ec18e..5b4e4479 100644 --- a/src/machine/machine_errors.rs +++ b/src/machine/machine_errors.rs @@ -77,6 +77,12 @@ impl ValidType { } } +#[derive(Debug, Clone, Copy)] +pub(crate) enum ResourceError { + FiniteMemory(HeapCellValue), + OutOfFiles +} + pub(crate) trait TypeError { fn type_error(self, machine_st: &mut MachineState, valid_type: ValidType) -> MachineError; } @@ -284,11 +290,21 @@ impl MachineState { } } - pub(super) fn resource_error(&mut self, value: HeapCellValue) -> MachineError { - let stub = functor!( - atom!("resource_error"), - [atom(atom!("finite_memory")), cell(value)] - ); + pub(super) fn resource_error(&mut self, err: ResourceError) -> MachineError { + let stub = match err { + ResourceError::FiniteMemory(size_requested) => { + functor!( + atom!("resource_error"), + [atom(atom!("finite_memory")), cell(size_requested)] + ) + } + ResourceError::OutOfFiles => { + functor!( + atom!("resource_atom"), + [atom(atom!("out_of_files"))] + ) + } + }; MachineError { stub, diff --git a/src/machine/streams.rs b/src/machine/streams.rs index b91ea8b8..b5632417 100644 --- a/src/machine/streams.rs +++ b/src/machine/streams.rs @@ -1804,7 +1804,7 @@ impl MachineState { ) -> Result { if file_spec == atom!("") { let stub = functor_stub(atom!("open"), 4); - let err = self.domain_error(DomainErrorType::SourceSink, self[temp_v!(1)]); + let err = self.domain_error(DomainErrorType::SourceSink, self.registers[1]); return Err(self.error_form(err, stub)); } @@ -1816,9 +1816,7 @@ impl MachineState { } } - let mode = MachineState::deref(self, self[temp_v!(2)]); - let mode = cell_as_atom!(self.store(mode)); - + let mode = cell_as_atom!(self.store(MachineState::deref(self, self.registers[2]))); let mut open_options = OpenOptions::new(); let (is_input_file, in_append_mode) = match mode { @@ -1875,8 +1873,9 @@ impl MachineState { )); } _ => { + // assume the OS is out of file descriptors. let stub = functor_stub(atom!("open"), 4); - let err = self.syntax_error(ParserError::IO(err)); + let err = self.resource_error(ResourceError::OutOfFiles); return Err(self.error_form(err, stub)); } diff --git a/src/machine/system_calls.rs b/src/machine/system_calls.rs index 08d7ad21..9e2d9760 100644 --- a/src/machine/system_calls.rs +++ b/src/machine/system_calls.rs @@ -4244,7 +4244,7 @@ impl Machine { Ok(Number::Integer(n)) => match (&*n).try_into() as Result { Ok(n) => n, Err(_) => { - let err = self.machine_st.resource_error(len); + let err = self.machine_st.resource_error(ResourceError::FiniteMemory(len)); return Err(self.machine_st.error_form(err, stub_gen())); } }, -- 2.54.0