dereference bindings returned by stackful iterator (#1410, #1411)

This commit is contained in:
Mark Thom
2022-04-09 11:47:54 -06:00
parent b6504bf377
commit ed803d30cd
2 changed files with 31 additions and 19 deletions

View File

@@ -2047,16 +2047,16 @@ impl MachineState {
}
#[inline]
pub fn is_cyclic_term(&mut self, addr: HeapCellValue) -> bool {
if addr.is_constant() {
pub fn is_cyclic_term(&mut self, value: HeapCellValue) -> bool {
if value.is_constant() {
return false;
}
let addr = self.store(self.deref(addr));
let mut iter = stackful_preorder_iter(&mut self.heap, addr);
let mut iter = stackful_preorder_iter(&mut self.heap, value);
while let Some(value) = iter.next() {
if value.get_forwarding_bit() {
let value = unmark_cell_bits!(value);
let value = heap_bound_store(iter.heap, heap_bound_deref(iter.heap, value));
if value.is_compound() {
@@ -2514,11 +2514,20 @@ impl MachineState {
return true;
}
for v in stackful_preorder_iter(&mut self.heap, value) {
let v = unmark_cell_bits!(v);
let mut iter = stackful_preorder_iter(&mut self.heap, value);
if v.is_var() {
return true;
while let Some(value) = iter.next() {
let value = unmark_cell_bits!(value);
if value.is_var() {
let value = heap_bound_store(
iter.heap,
heap_bound_deref(iter.heap, value),
);
if value.is_var() {
return true;
}
}
}