From 9ae029b04dbf59d1579ecdea99afd5a77fb26274 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Tue, 3 Dec 2019 23:11:57 -0700 Subject: [PATCH] pop AND stack frames after unwinding the trail (#250) --- src/prolog/machine/machine_state.rs | 10 +++++++--- src/prolog/machine/machine_state_impl.rs | 8 ++++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/prolog/machine/machine_state.rs b/src/prolog/machine/machine_state.rs index deb79e00..fddfb264 100644 --- a/src/prolog/machine/machine_state.rs +++ b/src/prolog/machine/machine_state.rs @@ -510,8 +510,8 @@ pub(crate) trait CallPolicy: Any { machine_st.registers[i] = machine_st.or_stack[b][i].clone(); } - machine_st.pop_stack_frames(); - + let old_e = machine_st.e; + machine_st.num_of_args = n; machine_st.e = machine_st.or_stack[b].e; machine_st.cp = machine_st.or_stack[b].cp.clone(); @@ -522,6 +522,8 @@ pub(crate) trait CallPolicy: Any { machine_st.unwind_trail(old_tr, curr_tr); machine_st.tr = machine_st.or_stack[b].tr; + machine_st.pop_stack_frames(old_e); + machine_st.trail.truncate(machine_st.tr); let old_pstr_tr = machine_st.or_stack[b].pstr_tr; @@ -558,7 +560,7 @@ pub(crate) trait CallPolicy: Any { machine_st.registers[i] = machine_st.or_stack[b][i].clone(); } - machine_st.pop_stack_frames(); + let old_e = machine_st.e; machine_st.num_of_args = n; machine_st.e = machine_st.or_stack[b].e; @@ -570,6 +572,8 @@ pub(crate) trait CallPolicy: Any { machine_st.unwind_trail(old_tr, curr_tr); machine_st.tr = machine_st.or_stack[b].tr; + machine_st.pop_stack_frames(old_e); + machine_st.trail.truncate(machine_st.tr); let old_pstr_tr = machine_st.or_stack[b].pstr_tr; diff --git a/src/prolog/machine/machine_state_impl.rs b/src/prolog/machine/machine_state_impl.rs index c98a80ed..63ace01f 100644 --- a/src/prolog/machine/machine_state_impl.rs +++ b/src/prolog/machine/machine_state_impl.rs @@ -3172,9 +3172,9 @@ impl MachineState { self.p += 1; } - pub(super) fn pop_stack_frames(&mut self) { - if self.and_stack.len() > self.e { - let and_gi = self.and_stack[self.e].global_index; + pub(super) fn pop_stack_frames(&mut self, e: usize) { + if self.and_stack.len() > e { + let and_gi = self.and_stack[e].global_index; let or_gi = self .or_stack .top() @@ -3182,7 +3182,7 @@ impl MachineState { .unwrap_or(0); if and_gi > or_gi { - self.and_stack.truncate(self.e + 1); + self.and_stack.truncate(e + 1); } } } -- 2.54.0