From f9d44c93fd87ea570e00e9262714aa0a0443e4fc Mon Sep 17 00:00:00 2001 From: Mark Date: Tue, 3 Oct 2023 15:31:01 -0600 Subject: [PATCH] check for free variables in locations removed from iterator stack in ground_test (#2075) --- src/machine/machine_state_impl.rs | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) 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); -- 2.54.0