remove list remnants from stack iteration in printer when cyclic (#2131)
This commit is contained in:
@@ -2257,9 +2257,7 @@ mod tests {
|
|||||||
list_loc_as_cell!(1)
|
list_loc_as_cell!(1)
|
||||||
);
|
);
|
||||||
assert_eq!(iter.next().unwrap(), cyclic_link);
|
assert_eq!(iter.next().unwrap(), cyclic_link);
|
||||||
|
|
||||||
assert_eq!(iter.next().unwrap(), cyclic_link);
|
assert_eq!(iter.next().unwrap(), cyclic_link);
|
||||||
|
|
||||||
assert_eq!(iter.next().unwrap(), cyclic_link);
|
assert_eq!(iter.next().unwrap(), cyclic_link);
|
||||||
|
|
||||||
assert_eq!(iter.next(), None);
|
assert_eq!(iter.next(), None);
|
||||||
|
|||||||
@@ -888,6 +888,19 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> {
|
|||||||
var_opt => {
|
var_opt => {
|
||||||
if is_cyclic && cell.is_compound(self.iter.heap) {
|
if is_cyclic && cell.is_compound(self.iter.heap) {
|
||||||
// self-referential variables are marked "cyclic".
|
// self-referential variables are marked "cyclic".
|
||||||
|
read_heap_cell!(cell,
|
||||||
|
(HeapCellValueTag::Lis, vh) => {
|
||||||
|
if self.iter.heap[vh].get_forwarding_bit() {
|
||||||
|
self.iter.pop_stack();
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.iter.heap[vh+1].get_forwarding_bit() {
|
||||||
|
self.iter.pop_stack();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
);
|
||||||
|
|
||||||
match var_opt {
|
match var_opt {
|
||||||
Some(var) => {
|
Some(var) => {
|
||||||
// If the term is bound to a named variable,
|
// If the term is bound to a named variable,
|
||||||
|
|||||||
@@ -175,6 +175,15 @@ impl<'a, const STOP_AT_CYCLES: bool> CycleDetectingIter<'a, STOP_AT_CYCLES> {
|
|||||||
None => return None,
|
None => return None,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if self.cycle_detection_active() {
|
||||||
|
for idx in (self.next as usize .. last_cell_loc).rev() {
|
||||||
|
if self.heap[idx].get_forwarding_bit() {
|
||||||
|
self.cycle_found = true;
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (last_cell_loc + 1) as u64 == self.next {
|
if (last_cell_loc + 1) as u64 == self.next {
|
||||||
if self.backward() {
|
if self.backward() {
|
||||||
return None;
|
return None;
|
||||||
@@ -186,15 +195,6 @@ impl<'a, const STOP_AT_CYCLES: bool> CycleDetectingIter<'a, STOP_AT_CYCLES> {
|
|||||||
self.heap[last_cell_loc].set_mark_bit(self.mark_phase);
|
self.heap[last_cell_loc].set_mark_bit(self.mark_phase);
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.cycle_detection_active() {
|
|
||||||
for idx in (self.next as usize .. last_cell_loc).rev() {
|
|
||||||
if self.heap[idx].get_forwarding_bit() {
|
|
||||||
self.cycle_found = true;
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
self.heap[last_cell_loc].set_forwarding_bit(true);
|
self.heap[last_cell_loc].set_forwarding_bit(true);
|
||||||
|
|
||||||
self.next = self.heap[last_cell_loc].get_value();
|
self.next = self.heap[last_cell_loc].get_value();
|
||||||
|
|||||||
@@ -255,6 +255,11 @@ test("acyclic_term#2130_2", (
|
|||||||
\+ acyclic_term(T)
|
\+ acyclic_term(T)
|
||||||
)).
|
)).
|
||||||
|
|
||||||
|
test("acyclic_term#2131", (
|
||||||
|
A=[B],C=[B],C=[A],
|
||||||
|
\+ acyclic_term(C)
|
||||||
|
)).
|
||||||
|
|
||||||
main :-
|
main :-
|
||||||
findall(test(Name, Goal), test(Name, Goal), Tests),
|
findall(test(Name, Goal), test(Name, Goal), Tests),
|
||||||
run_tests(Tests, Failed),
|
run_tests(Tests, Failed),
|
||||||
|
|||||||
Reference in New Issue
Block a user