]> Repositorios git - scryer-prolog.git/commitdiff
check for free variables in locations removed from iterator stack in ground_test...
authorMark <[email protected]>
Tue, 3 Oct 2023 21:31:01 +0000 (15:31 -0600)
committerMark <[email protected]>
Tue, 3 Oct 2023 21:31:01 +0000 (15:31 -0600)
src/machine/machine_state_impl.rs

index c8d7a4dc2431a8443b254d91d96f693a98e60919..75c3deb21a4ee0ddc02b9acd2a5b3e6b4c6cd37f 100644 (file)
@@ -1637,21 +1637,33 @@ impl MachineState {
         let mut iter = stackful_preorder_iter::<NonListElider>(&mut self.heap, &mut self.stack, value);
         let mut stack_len = 0;
 
-        while let Some(value) = iter.next() {
-            let mut value = unmark_cell_bits!(value);
+        let is_var = |heap: &Heap, value: HeapCellValue| -> bool {
+            let value = unmark_cell_bits!(value);
 
             if value.is_var() {
-                value = heap_bound_store(iter.heap, heap_bound_deref(iter.heap, value));
+                let value = heap_bound_store(heap, heap_bound_deref(heap, value));
 
                 if value.is_var() {
                     return true;
                 }
             }
 
+            false
+        };
+
+        while let Some(value) = iter.next() {
+            if is_var(iter.heap, value) {
+                return true;
+            }
+
             if value.is_ref() {
                 if visited.contains(&value) {
-                    for _ in stack_len..iter.stack_len() {
-                        iter.pop_stack();
+                    while iter.stack_len() > stack_len {
+                        if let Some(value) = iter.pop_stack() {
+                            if is_var(iter.heap, value) {
+                                return true;
+                            }
+                        }
                     }
                 } else {
                     visited.insert(value);