check for free variables in locations removed from iterator stack in ground_test (#2075)
This commit is contained in:
@@ -1637,21 +1637,33 @@ impl MachineState {
|
|||||||
let mut iter = stackful_preorder_iter::<NonListElider>(&mut self.heap, &mut self.stack, value);
|
let mut iter = stackful_preorder_iter::<NonListElider>(&mut self.heap, &mut self.stack, value);
|
||||||
let mut stack_len = 0;
|
let mut stack_len = 0;
|
||||||
|
|
||||||
while let Some(value) = iter.next() {
|
let is_var = |heap: &Heap, value: HeapCellValue| -> bool {
|
||||||
let mut value = unmark_cell_bits!(value);
|
let value = unmark_cell_bits!(value);
|
||||||
|
|
||||||
if value.is_var() {
|
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() {
|
if value.is_var() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
false
|
||||||
|
};
|
||||||
|
|
||||||
|
while let Some(value) = iter.next() {
|
||||||
|
if is_var(iter.heap, value) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if value.is_ref() {
|
if value.is_ref() {
|
||||||
if visited.contains(&value) {
|
if visited.contains(&value) {
|
||||||
for _ in stack_len..iter.stack_len() {
|
while iter.stack_len() > stack_len {
|
||||||
iter.pop_stack();
|
if let Some(value) = iter.pop_stack() {
|
||||||
|
if is_var(iter.heap, value) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
visited.insert(value);
|
visited.insert(value);
|
||||||
|
|||||||
Reference in New Issue
Block a user