]> Repositorios git - scryer-prolog.git/commitdiff
throw errors on cyclic terms when evaluating is/2 expressions
authorMark Thom <[email protected]>
Fri, 8 Apr 2022 05:06:58 +0000 (23:06 -0600)
committerMark Thom <[email protected]>
Fri, 8 Apr 2022 05:06:58 +0000 (23:06 -0600)
src/machine/arithmetic_ops.rs

index 01dd9d55b8187673d8c7b9633914cea604b1aa39..2f1504b7a8b719c5c364cc0d4036f645098cf9a1 100644 (file)
@@ -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,