]> Repositorios git - scryer-prolog.git/commitdiff
correct bug in bb_b_put, correct stack truncation bug resulting in erroneous failures...
authorMark Thom <[email protected]>
Mon, 20 Jan 2020 03:56:11 +0000 (20:56 -0700)
committerMark Thom <[email protected]>
Mon, 20 Jan 2020 03:56:11 +0000 (20:56 -0700)
src/prolog/lib/non_iso.pl
src/prolog/machine/attributed_variables.rs
src/prolog/machine/machine_state.rs
src/prolog/machine/machine_state_impl.rs
src/prolog/machine/system_calls.rs

index 22f0001ecff5f8a5c4ddac208250a52cae3f2d80..136e1e3a5659fd7d0ab2e9747869b6759926035e 100644 (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))
     ).
 
index eb0fbbb5619a994013471c63b2f8b17d3d5035eb..6c2dc4c196d30be20d4af1de3501c41a14758323 100644 (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();
 
index 84af7ccbae41be465f29029eb7fa0a51ac2af97b..134b2924d8663a75f173fc55f42b14b88cfba893 100644 (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();
                 }
             }
             _ => {
index d56cd17b688a53dd2ef9cf6c36ef576ef158b730..11894901f9940d708e764d1c62a0e7665cb053a9 100644 (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;
index 13138be8b8cd1574b59e9fdc215110d57737a1d5..4aae067cd700f58739afa696bcaec2d377863ffc 100644 (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,