}
}
+#[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;
}
}
}
- 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,
) -> Result<Stream, MachineStub> {
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));
}
}
}
- 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 {
));
}
_ => {
+ // 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));
}
Ok(Number::Integer(n)) => match (&*n).try_into() as Result<usize, _> {
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()));
}
},