From 6be2d8ccf2aee1600c10fb0afc6b01a52ecc319e Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Sun, 19 Jan 2020 20:56:11 -0700 Subject: [PATCH] correct bug in bb_b_put, correct stack truncation bug resulting in erroneous failures (affecting issue #255 and the in-progress tabling library) --- src/prolog/lib/non_iso.pl | 2 +- src/prolog/machine/attributed_variables.rs | 6 ++++-- src/prolog/machine/machine_state.rs | 10 ++++------ src/prolog/machine/machine_state_impl.rs | 2 -- src/prolog/machine/system_calls.rs | 1 - 5 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/prolog/lib/non_iso.pl b/src/prolog/lib/non_iso.pl index 22f0001e..136e1e3a 100644 --- a/src/prolog/lib/non_iso.pl +++ b/src/prolog/lib/non_iso.pl @@ -21,7 +21,7 @@ bb_b_put(Key, NewValue) :- ( '$bb_get_with_offset'(Key, OldValue, OldOffset) -> call_cleanup((store_global_var_with_offset(Key, NewValue) ; false), reset_global_var_at_offset(Key, OldValue, OldOffset)) - ; call_cleanup((store_global_var(Key, NewValue, _) ; false), + ; call_cleanup((store_global_var_with_offset(Key, NewValue) ; false), reset_global_var_at_key(Key)) ). diff --git a/src/prolog/machine/attributed_variables.rs b/src/prolog/machine/attributed_variables.rs index eb0fbbb5..6c2dc4c1 100644 --- a/src/prolog/machine/attributed_variables.rs +++ b/src/prolog/machine/attributed_variables.rs @@ -117,8 +117,10 @@ impl MachineState { self.stack.index_and_frame_mut(e)[i] = self[RegType::Temp(i)].clone(); } - self.stack.index_and_frame_mut(e)[self.num_of_args + 1] = Addr::Con(Constant::CutPoint(self.b0)); - self.stack.index_and_frame_mut(e)[self.num_of_args + 2] = Addr::Con(Constant::Usize(self.num_of_args)); + self.stack.index_and_frame_mut(e)[self.num_of_args + 1] = + Addr::Con(Constant::CutPoint(self.b0)); + self.stack.index_and_frame_mut(e)[self.num_of_args + 2] = + Addr::Con(Constant::Usize(self.num_of_args)); self.verify_attributes(); diff --git a/src/prolog/machine/machine_state.rs b/src/prolog/machine/machine_state.rs index 84af7ccb..134b2924 100644 --- a/src/prolog/machine/machine_state.rs +++ b/src/prolog/machine/machine_state.rs @@ -552,8 +552,8 @@ pub(crate) trait CallPolicy: Any { attr_var_init_queue_b, attr_var_init_bindings_b); - machine_st.b = machine_st.stack.index_or_frame(b).prelude.b; machine_st.truncate_stack(); + machine_st.b = machine_st.stack.index_or_frame(b).prelude.b; machine_st.hb = machine_st.heap.h; machine_st.p += offset; @@ -597,11 +597,11 @@ pub(crate) trait CallPolicy: Any { machine_st.attr_var_init.backtrack( attr_var_init_queue_b, - attr_var_init_bindings_b + attr_var_init_bindings_b, ); - machine_st.b = machine_st.stack.index_or_frame(b).prelude.b; machine_st.truncate_stack(); + machine_st.b = machine_st.stack.index_or_frame(b).prelude.b; machine_st.hb = machine_st.heap.h; machine_st.p += 1; @@ -881,7 +881,7 @@ pub(crate) trait CallPolicy: Any { if machine_st.fail { return Ok(()); } - + machine_st.p = CodePtr::CallN(arity, machine_st.p.local(), machine_st.last_call); } ClauseType::Inlined(inlined) => { @@ -1069,7 +1069,6 @@ fn cut_body(machine_st: &mut MachineState, addr: Addr) -> bool { machine_st.b = b0; machine_st.tidy_trail(); machine_st.tidy_pstr_trail(); - machine_st.truncate_stack(); } } _ => { @@ -1157,7 +1156,6 @@ impl CutPolicy for SCCCutPolicy { machine_st.b = b0; machine_st.tidy_trail(); machine_st.tidy_pstr_trail(); - machine_st.truncate_stack(); } } _ => { diff --git a/src/prolog/machine/machine_state_impl.rs b/src/prolog/machine/machine_state_impl.rs index d56cd17b..11894901 100644 --- a/src/prolog/machine/machine_state_impl.rs +++ b/src/prolog/machine/machine_state_impl.rs @@ -2074,7 +2074,6 @@ impl MachineState { pub(super) fn unwind_stack(&mut self) { self.b = self.block; - self.truncate_stack(); self.fail = true; } @@ -3329,7 +3328,6 @@ impl MachineState { self.b = b0; self.tidy_trail(); self.tidy_pstr_trail(); - self.truncate_stack(); } self.p += 1; diff --git a/src/prolog/machine/system_calls.rs b/src/prolog/machine/system_calls.rs index 13138be8..4aae067c 100644 --- a/src/prolog/machine/system_calls.rs +++ b/src/prolog/machine/system_calls.rs @@ -2025,7 +2025,6 @@ impl MachineState { if nb > 0 && self.stack.index_or_frame(b).prelude.b == nb { self.b = self.stack.index_or_frame(nb).prelude.b; - self.truncate_stack(); } } _ => self.fail = true, -- 2.54.0