+use crate::arena::*;
use crate::atom_table::*;
use crate::parser::ast::*;
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::*;
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 {
}
(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));
+ }
+ _ => {
+ }
);
}
_ => {
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)
}
}
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);