correct bug in bb_b_put, correct stack truncation bug resulting in erroneous failures (affecting issue #255 and the in-progress tabling library)

This commit is contained in:
Mark Thom
2020-01-19 20:56:11 -07:00
parent 9958ad6f34
commit 6be2d8ccf2
5 changed files with 9 additions and 12 deletions

View File

@@ -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))
).

View File

@@ -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();

View File

@@ -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();
}
}
_ => {

View File

@@ -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;

View File

@@ -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,