From 86161ccf2a4867868b7e87b778cd6a74dee17f6c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Adri=C3=A1n=20Arroyo=20Calle?= Date: Sun, 28 Nov 2021 12:37:16 +0100 Subject: [PATCH] Allow all kinds of string to be processed in open/4 --- src/lib/builtins.pl | 6 +++++- src/machine/system_calls.rs | 27 +++------------------------ 2 files changed, 8 insertions(+), 25 deletions(-) diff --git a/src/lib/builtins.pl b/src/lib/builtins.pl index f8808ebb..808cab81 100644 --- a/src/lib/builtins.pl +++ b/src/lib/builtins.pl @@ -1475,7 +1475,11 @@ open(SourceSink, Mode, Stream, StreamOptions) :- ( SourceSink = stream(S0) -> '$set_stream_options'(S0, Alias, EOFAction, Reposition, Type), Stream = S0 - ; '$open'(SourceSink, Mode, Stream, Alias, EOFAction, Reposition, Type) + ; ( + atom(SourceSink) -> + atom_chars(SourceSink, SourceSinkString) + ; SourceSink = SourceSinkString + ), '$open'(SourceSinkString, Mode, Stream, Alias, EOFAction, Reposition, Type) ) ). diff --git a/src/machine/system_calls.rs b/src/machine/system_calls.rs index 5df1474f..302e1fc5 100644 --- a/src/machine/system_calls.rs +++ b/src/machine/system_calls.rs @@ -3169,31 +3169,10 @@ impl MachineState { let options = self.to_stream_options(alias, eof_action, reposition, stream_type); - let mut stream = match self.store(self.deref(self[temp_v!(1)])) { - Addr::Con(h) if self.heap.atom_at(h) => match &self.heap[h] { - &HeapCellValue::Atom(ref atom, _) => { - self.stream_from_file_spec(atom.clone(), indices, &options)? - } - _ => { - unreachable!() - } - }, - Addr::Char(c) => { - let atom = clause_name!(c.to_string(), self.atom_tbl); - self.stream_from_file_spec(atom, indices, &options)? - } - Addr::PStrLocation(h, n) => match &self.heap[h] { - &HeapCellValue::PartialString(_, _has_tail @ false) => { - let mut heap_pstr_iter = self.heap_pstr_iter(Addr::PStrLocation(h, n)); - - let file_spec = clause_name!(heap_pstr_iter.to_string(), self.atom_tbl); + let mut iter = self.heap_pstr_iter(self[temp_v!(1)]); + let file_spec = clause_name!(iter.to_string(), self.atom_tbl); - self.stream_from_file_spec(file_spec, indices, &options)? - } - _ => self.stream_from_file_spec(clause_name!(""), indices, &options)?, - }, - _ => self.stream_from_file_spec(clause_name!(""), indices, &options)?, - }; + let mut stream = self.stream_from_file_spec(file_spec, indices, &options)?; *stream.options_mut() = options; -- 2.54.0