From 85b4f235ef4986760038ec73572bee8d5b3931e8 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Thu, 7 Apr 2022 23:06:58 -0600 Subject: [PATCH] throw errors on cyclic terms when evaluating is/2 expressions --- src/machine/arithmetic_ops.rs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) 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, -- 2.54.0