From: Mark Thom Date: Fri, 8 Apr 2022 05:06:58 +0000 (-0600) Subject: throw errors on cyclic terms when evaluating is/2 expressions X-Git-Tag: v0.9.1~69 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=85b4f235ef4986760038ec73572bee8d5b3931e8;p=scryer-prolog.git throw errors on cyclic terms when evaluating is/2 expressions --- diff --git a/src/machine/arithmetic_ops.rs b/src/machine/arithmetic_ops.rs index 01dd9d55..2f1504b7 100644 --- a/src/machine/arithmetic_ops.rs +++ b/src/machine/arithmetic_ops.rs @@ -1102,24 +1102,30 @@ impl MachineState { while let Some(value) = iter.next() { if value.get_forwarding_bit() { + std::mem::drop(iter); + let (name, arity) = read_heap_cell!(value, (HeapCellValueTag::Atom, (name, arity)) => { (name, arity) } - (HeapCellValueTag::Lis | HeapCellValueTag::PStr) => { + (HeapCellValueTag::Str, s) => { + cell_as_atom_cell!(self.heap[s]).get_name_and_arity() + } + (HeapCellValueTag::Lis | HeapCellValueTag::PStr | HeapCellValueTag::PStrOffset | + HeapCellValueTag::PStrLoc) => { (atom!("."), 2) } + (HeapCellValueTag::AttrVar | HeapCellValueTag::Var) => { + let err = self.instantiation_error(); + return Err(self.error_form(err, stub_gen())); + } _ => { unreachable!() } ); - std::mem::drop(iter); - let evaluable_error = self.evaluable_error(name, arity); - let stub = stub_gen(); - - return Err(self.error_form(evaluable_error, stub)); + return Err(self.error_form(evaluable_error, stub_gen())); } read_heap_cell!(value,