From: Mark Thom Date: Tue, 21 Jan 2020 03:59:30 +0000 (-0700) Subject: don't hold on to popped or frames X-Git-Tag: v0.8.118~23 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=40bf5bc75fc4124b4d6d0e373aabc0220a53e9ce;p=scryer-prolog.git don't hold on to popped or frames --- diff --git a/src/prolog/machine/machine_state.rs b/src/prolog/machine/machine_state.rs index 134b2924..05749105 100644 --- a/src/prolog/machine/machine_state.rs +++ b/src/prolog/machine/machine_state.rs @@ -552,7 +552,7 @@ pub(crate) trait CallPolicy: Any { attr_var_init_queue_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.hb = machine_st.heap.h; @@ -600,7 +600,7 @@ pub(crate) trait CallPolicy: Any { 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.hb = machine_st.heap.h; diff --git a/src/prolog/machine/machine_state_impl.rs b/src/prolog/machine/machine_state_impl.rs index 11894901..57aeab5d 100644 --- a/src/prolog/machine/machine_state_impl.rs +++ b/src/prolog/machine/machine_state_impl.rs @@ -2077,12 +2077,6 @@ impl MachineState { 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 { let mut seen = IndexSet::new(); let mut fail = false; diff --git a/src/prolog/machine/stack.rs b/src/prolog/machine/stack.rs index 2de3582d..a9551756 100644 --- a/src/prolog/machine/stack.rs +++ b/src/prolog/machine/stack.rs @@ -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 { - self.truncate(mem::align_of::()); + self.inner_truncate(mem::align_of::()); } else { - let univ_prelude = self.index_or_frame(b).prelude.univ_prelude; - let size = OrFrame::size_of(univ_prelude.num_cells); - - self.truncate(b + size); + self.inner_truncate(b); } } - fn truncate(&mut self, b: usize) { + fn inner_truncate(&mut self, b: usize) { let mut b = b + self.base as usize; let base = b;