diff --git a/src/heap_iter.rs b/src/heap_iter.rs index 032ce6bd..b8fd9dae 100644 --- a/src/heap_iter.rs +++ b/src/heap_iter.rs @@ -86,16 +86,22 @@ impl<'a> EagerStackfulPreOrderHeapIter<'a> { let arity = cell_as_atom_cell!(self.heap[s]).get_arity(); for idx in (s + 1 .. s + arity + 1).rev() { - self.iter_stack.push(self.heap[idx]); - self.heap[idx].set_mark_bit(self.mark_phase); + if self.heap[idx].get_mark_bit() != self.mark_phase { + self.iter_stack.push(self.heap[idx]); + self.heap[idx].set_mark_bit(self.mark_phase); + } } } (HeapCellValueTag::Lis, l) => { - self.iter_stack.push(self.heap[l+1]); - self.iter_stack.push(self.heap[l]); + if self.heap[l+1].get_mark_bit() != self.mark_phase { + self.iter_stack.push(self.heap[l+1]); + self.heap[l+1].set_mark_bit(self.mark_phase); + } - self.heap[l].set_mark_bit(self.mark_phase); - self.heap[l+1].set_mark_bit(self.mark_phase); + if self.heap[l].get_mark_bit() != self.mark_phase { + self.iter_stack.push(self.heap[l]); + self.heap[l].set_mark_bit(self.mark_phase); + } } (HeapCellValueTag::AttrVar | HeapCellValueTag::Var, h) => { let var_value = self.heap[h]; diff --git a/src/tests/term_variables.pl b/src/tests/term_variables.pl index dce49c83..f3ef5b32 100644 --- a/src/tests/term_variables.pl +++ b/src/tests/term_variables.pl @@ -45,7 +45,7 @@ test("term_variables#2097", ( test("term_variables#2100", ( termt2(T), term_variables(T,Vs), - T = [[T|_B]|_A], Vs == [_A,_B] + T = [[T|A]|B], Vs == [A,B] )). test("term_variables#2101", (