From 77de570aa41119fb8c527e4193184d66fdcb683c Mon Sep 17 00:00:00 2001 From: Mark Date: Tue, 10 Oct 2023 11:13:42 -0600 Subject: [PATCH] report pre-marked values from eager stackful iterator (#2097) --- src/heap_iter.rs | 8 ++++++++ src/tests/term_variables.pl | 11 +++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/heap_iter.rs b/src/heap_iter.rs index ef5e4ac5..02d87ace 100644 --- a/src/heap_iter.rs +++ b/src/heap_iter.rs @@ -59,6 +59,14 @@ impl<'a> EagerStackfulPreOrderHeapIter<'a> { fn follow(&mut self) -> Option { while let Some(value) = self.iter_stack.pop() { if value.get_mark_bit() == self.mark_phase { + if value.is_var() { + let h = value.get_value() as usize; + + if self.heap[h].is_var() && self.heap[h].get_value() as usize == h { + return Some(unmark_cell_bits!(value)); + } + } + continue; } diff --git a/src/tests/term_variables.pl b/src/tests/term_variables.pl index 57c55ed1..01dde0d1 100644 --- a/src/tests/term_variables.pl +++ b/src/tests/term_variables.pl @@ -38,6 +38,17 @@ test("term_variables#2063", ( Vars = [C] )). +test("term_variables#2097", ( + termt(T), term_variables(T,Vs), + T = [[[A|B]|A]|A], Vs == [A,B] +)). + +termt(T) :- + T = [T1|T2], + T1 = [T3|A], + T3 = [A|_], + T2 = A. + main :- findall(test(Name, Goal), test(Name, Goal), Tests), run_tests(Tests, Failed), -- 2.54.0