From: Mark Date: Tue, 3 Oct 2023 21:31:01 +0000 (-0600) Subject: check for free variables in locations removed from iterator stack in ground_test... X-Git-Tag: remove~54 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=f9d44c93fd87ea570e00e9262714aa0a0443e4fc;p=scryer-prolog.git check for free variables in locations removed from iterator stack in ground_test (#2075) --- diff --git a/src/machine/machine_state_impl.rs b/src/machine/machine_state_impl.rs index c8d7a4dc..75c3deb2 100644 --- a/src/machine/machine_state_impl.rs +++ b/src/machine/machine_state_impl.rs @@ -1637,21 +1637,33 @@ impl MachineState { let mut iter = stackful_preorder_iter::(&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);