]> Repositorios git - scryer-prolog.git/commitdiff
Allow all kinds of string to be processed in open/4
authorAdrián Arroyo Calle <[email protected]>
Sun, 28 Nov 2021 11:37:16 +0000 (12:37 +0100)
committerAdrián Arroyo Calle <[email protected]>
Sun, 28 Nov 2021 11:37:16 +0000 (12:37 +0100)
src/lib/builtins.pl
src/machine/system_calls.rs

index f8808ebb1adf068ecb32c45cb264040927064817..808cab8131f40bc59dea3cf365569182228b04f9 100644 (file)
@@ -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)
        )
     ).
 
index 5df1474f2fac46df5dc544845374d7d58914615e..302e1fc5071b9ac3d08b429946eaf9d73a7c4c08 100644 (file)
@@ -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;