don't hold on to popped or frames
This commit is contained in:
@@ -552,7 +552,7 @@ pub(crate) trait CallPolicy: Any {
|
|||||||
attr_var_init_queue_b,
|
attr_var_init_queue_b,
|
||||||
attr_var_init_bindings_b);
|
attr_var_init_bindings_b);
|
||||||
|
|
||||||
machine_st.truncate_stack();
|
machine_st.stack.truncate(machine_st.b);
|
||||||
machine_st.b = machine_st.stack.index_or_frame(b).prelude.b;
|
machine_st.b = machine_st.stack.index_or_frame(b).prelude.b;
|
||||||
|
|
||||||
machine_st.hb = machine_st.heap.h;
|
machine_st.hb = machine_st.heap.h;
|
||||||
@@ -600,7 +600,7 @@ pub(crate) trait CallPolicy: Any {
|
|||||||
attr_var_init_bindings_b,
|
attr_var_init_bindings_b,
|
||||||
);
|
);
|
||||||
|
|
||||||
machine_st.truncate_stack();
|
machine_st.stack.truncate(machine_st.b);
|
||||||
machine_st.b = machine_st.stack.index_or_frame(b).prelude.b;
|
machine_st.b = machine_st.stack.index_or_frame(b).prelude.b;
|
||||||
|
|
||||||
machine_st.hb = machine_st.heap.h;
|
machine_st.hb = machine_st.heap.h;
|
||||||
|
|||||||
@@ -2077,12 +2077,6 @@ impl MachineState {
|
|||||||
self.fail = true;
|
self.fail = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn truncate_stack(&mut self) {
|
|
||||||
if self.b > self.e {
|
|
||||||
self.stack.truncate_to_frame(self.b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn is_cyclic_term(&self, addr: Addr) -> bool {
|
pub(crate) fn is_cyclic_term(&self, addr: Addr) -> bool {
|
||||||
let mut seen = IndexSet::new();
|
let mut seen = IndexSet::new();
|
||||||
let mut fail = false;
|
let mut fail = false;
|
||||||
|
|||||||
@@ -321,18 +321,15 @@ impl Stack {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn truncate_to_frame(&mut self, b: usize) {
|
pub fn truncate(&mut self, b: usize) {
|
||||||
if b == 0 {
|
if b == 0 {
|
||||||
self.truncate(mem::align_of::<Addr>());
|
self.inner_truncate(mem::align_of::<Addr>());
|
||||||
} else {
|
} else {
|
||||||
let univ_prelude = self.index_or_frame(b).prelude.univ_prelude;
|
self.inner_truncate(b);
|
||||||
let size = OrFrame::size_of(univ_prelude.num_cells);
|
|
||||||
|
|
||||||
self.truncate(b + size);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn truncate(&mut self, b: usize) {
|
fn inner_truncate(&mut self, b: usize) {
|
||||||
let mut b = b + self.base as usize;
|
let mut b = b + self.base as usize;
|
||||||
let base = b;
|
let base = b;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user