]> Repositorios git - scryer-prolog.git/commitdiff
emit stream aliases as permission error culprits whenever possible
authorMark <[email protected]>
Wed, 12 Jul 2023 18:17:06 +0000 (12:17 -0600)
committerMark <[email protected]>
Wed, 12 Jul 2023 18:17:06 +0000 (12:17 -0600)
src/machine/machine_errors.rs
src/machine/streams.rs

index 4422fdaeb7430e0827fefd5959311a91e2a82bdd..62b06ca25a67d95e42fc7cebff22a2291b7e59d8 100644 (file)
@@ -1,3 +1,4 @@
+use crate::arena::*;
 use crate::atom_table::*;
 use crate::parser::ast::*;
 
@@ -6,6 +7,7 @@ use crate::forms::*;
 use crate::machine::heap::*;
 use crate::machine::loader::CompilationTarget;
 use crate::machine::machine_state::*;
+use crate::machine::streams::*;
 use crate::machine::system_calls::BrentAlgState;
 use crate::types::*;
 
@@ -158,9 +160,29 @@ impl PermissionError for HeapCellValue {
         index_atom: Atom,
         perm: Permission,
     ) -> MachineError {
+        let cell = read_heap_cell!(self,
+            (HeapCellValueTag::Cons, ptr) => {
+                match_untyped_arena_ptr!(ptr,
+                    (ArenaHeaderTag::Stream, stream) => {
+                        if let Some(alias) = stream.options().get_alias() {
+                            atom_as_cell!(alias)
+                        } else {
+                            self
+                        }
+                    }
+                    _ => {
+                        self
+                    }
+                )
+            }
+            _ => {
+                self
+            }
+        );
+
         let stub = functor!(
             atom!("permission_error"),
-            [atom(perm.as_atom()), atom(index_atom), cell(self)]
+            [atom(perm.as_atom()), atom(index_atom), cell(cell)]
         );
 
         MachineError {
index 80c51537b5faeac003b5c10150c8b202f586474e..90f927c40f132afb7b1f82ebeef2719ed342367a 100644 (file)
@@ -1491,21 +1491,21 @@ impl MachineState {
                         }
                         (HeapCellValueTag::Cons, ptr) => {
                             match_untyped_arena_ptr!(ptr,
-                                                     (ArenaHeaderTag::Stream, stream) => {
-                                                         return if stream.is_null_stream() {
-                                                             Err(self.open_permission_error(stream_as_cell!(stream), caller, arity))
-                                                         } else {
-                                                             Ok(stream)
-                                                         };
-                                                     }
-                                                     (ArenaHeaderTag::Dropped, _value) => {
-                                                         let stub = functor_stub(caller, arity);
-                                                         let err = self.existence_error(ExistenceError::Stream(addr));
-
-                                                         return Err(self.error_form(err, stub));
-                                                     }
-                                                     _ => {
-                                                     }
+                                (ArenaHeaderTag::Stream, stream) => {
+                                    return if stream.is_null_stream() {
+                                        Err(self.open_permission_error(stream_as_cell!(stream), caller, arity))
+                                    } else {
+                                        Ok(stream)
+                                    };
+                                }
+                                (ArenaHeaderTag::Dropped, _value) => {
+                                    let stub = functor_stub(caller, arity);
+                                    let err = self.existence_error(ExistenceError::Stream(addr));
+
+                                    return Err(self.error_form(err, stub));
+                                }
+                                _ => {
+                                }
                             );
                         }
                         _ => {
@@ -1547,7 +1547,15 @@ impl MachineState {
         arity: usize,
     ) -> MachineStub {
         let stub = functor_stub(caller, arity);
-        let err  = self.permission_error(perm, err_atom, stream_as_cell!(stream));
+        let err  = self.permission_error(
+            perm,
+            err_atom,
+            if let Some(alias) = stream.options().get_alias() {
+                atom_as_cell!(alias)
+            } else {
+                stream_as_cell!(stream)
+            },
+        );
 
         self.error_form(err, stub)
     }
@@ -1715,7 +1723,7 @@ impl MachineState {
                     }
                     ErrorKind::PermissionDenied => {
                         // 8.11.5.3k)
-                        return Err(self.open_permission_error(self[temp_v!(1)], atom!("open"), 4));
+                        return Err(self.open_permission_error(self.registers[1], atom!("open"), 4));
                     }
                     _ => {
                         let stub = functor_stub(atom!("open"), 4);