From: Mark Date: Wed, 12 Jul 2023 18:17:06 +0000 (-0600) Subject: emit stream aliases as permission error culprits whenever possible X-Git-Tag: v0.9.2~66 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=3f5dbc16804ca349bf79a8d8f58d067c303f948f;p=scryer-prolog.git emit stream aliases as permission error culprits whenever possible --- diff --git a/src/machine/machine_errors.rs b/src/machine/machine_errors.rs index 4422fdae..62b06ca2 100644 --- a/src/machine/machine_errors.rs +++ b/src/machine/machine_errors.rs @@ -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 { diff --git a/src/machine/streams.rs b/src/machine/streams.rs index 80c51537..90f927c4 100644 --- a/src/machine/streams.rs +++ b/src/machine/streams.rs @@ -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);