]> Repositorios git - scryer-prolog.git/commitdiff
add backtracking of attributed variable data
authorMark Thom <[email protected]>
Sat, 7 Dec 2019 00:52:40 +0000 (20:52 -0400)
committerMark Thom <[email protected]>
Sat, 7 Dec 2019 00:52:40 +0000 (20:52 -0400)
src/prolog/machine/attributed_variables.rs
src/prolog/machine/machine_state.rs
src/prolog/machine/machine_state_impl.rs

index 0a1195392bcd727ca9c58e531fedb821fd00bf57..1edc240d2b0a4ef420fd60ccd770be64b67dd89f 100644 (file)
@@ -36,19 +36,25 @@ impl AttrVarInitializer {
         self.attr_var_queue.clear();
         self.bindings.clear();
     }
+
+    #[inline]
+    pub(super) fn backtrack(&mut self, queue_b: usize, bindings_b: usize) {
+        self.attr_var_queue.truncate(queue_b);
+        self.bindings.truncate(bindings_b);
+    }
 }
 
 impl MachineState {
     pub(super) fn push_attr_var_binding(&mut self, h: usize, addr: Addr) {
         if self.attr_var_init.bindings.is_empty() {
             self.attr_var_init.instigating_p = self.p.local();
-            
+
             if self.last_call {
                 self.attr_var_init.cp = self.cp;
             } else {
                 self.attr_var_init.cp = self.p.local() + 1;
             }
-            
+
             self.p = CodePtr::VerifyAttrInterrupt(self.attr_var_init.verify_attrs_loc);
         }
 
@@ -61,6 +67,7 @@ impl MachineState {
             .bindings
             .iter()
             .map(|(ref h, _)| Addr::AttrVar(*h));
+
         let var_list_addr = Addr::HeapCell(self.heap.to_list(iter));
 
         let iter = self
@@ -68,6 +75,7 @@ impl MachineState {
             .bindings
             .iter()
             .map(|(_, ref addr)| addr.clone());
+
         let value_list_addr = Addr::HeapCell(self.heap.to_list(iter));
 
         (var_list_addr, value_list_addr)
index 5b26e0bb647f74153ff256920788f92664c0a42f..64c761cd1f6856ccae2bd7a325b6b3bf05e5302b 100644 (file)
@@ -441,11 +441,10 @@ pub(crate) trait CallPolicy: Any {
 
         machine_st.heap.truncate(machine_st.stack.index_or_frame(b).prelude.h);
 
-        let attr_var_init_b = machine_st.stack.index_or_frame(b).prelude.attr_var_init_b;
-        machine_st
-            .attr_var_init
-            .attr_var_queue
-            .truncate(attr_var_init_b);
+        let attr_var_init_queue_b = machine_st.stack.index_or_frame(b).prelude.attr_var_init_queue_b;
+        let attr_var_init_bindings_b = machine_st.stack.index_or_frame(b).prelude.attr_var_init_bindings_b;
+
+        machine_st.attr_var_init.backtrack(attr_var_init_queue_b, attr_var_init_bindings_b);
 
         machine_st.hb = machine_st.heap.h;
         machine_st.p += 1;
@@ -485,11 +484,10 @@ pub(crate) trait CallPolicy: Any {
 
         machine_st.heap.truncate(machine_st.stack.index_or_frame(b).prelude.h);
 
-        let attr_var_init_b = machine_st.stack.index_or_frame(b).prelude.attr_var_init_b;
-        machine_st
-            .attr_var_init
-            .attr_var_queue
-            .truncate(attr_var_init_b);
+        let attr_var_init_queue_b = machine_st.stack.index_or_frame(b).prelude.attr_var_init_queue_b;
+        let attr_var_init_bindings_b = machine_st.stack.index_or_frame(b).prelude.attr_var_init_bindings_b;
+
+        machine_st.attr_var_init.backtrack(attr_var_init_queue_b, attr_var_init_bindings_b);
 
         machine_st.hb = machine_st.heap.h;
         machine_st.p += offset;
@@ -527,11 +525,10 @@ pub(crate) trait CallPolicy: Any {
 
         machine_st.heap.truncate(machine_st.stack.index_or_frame(b).prelude.h);
 
-        let attr_var_init_b = machine_st.stack.index_or_frame(b).prelude.attr_var_init_b;
-        machine_st
-            .attr_var_init
-            .attr_var_queue
-            .truncate(attr_var_init_b);
+        let attr_var_init_queue_b = machine_st.stack.index_or_frame(b).prelude.attr_var_init_queue_b;
+        let attr_var_init_bindings_b = machine_st.stack.index_or_frame(b).prelude.attr_var_init_bindings_b;
+
+        machine_st.attr_var_init.backtrack(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();
@@ -572,11 +569,10 @@ pub(crate) trait CallPolicy: Any {
 
         machine_st.heap.truncate(machine_st.stack.index_or_frame(b).prelude.h);
 
-        let attr_var_init_b = machine_st.stack.index_or_frame(b).prelude.attr_var_init_b;
-        machine_st
-            .attr_var_init
-            .attr_var_queue
-            .truncate(attr_var_init_b);
+        let attr_var_init_queue_b = machine_st.stack.index_or_frame(b).prelude.attr_var_init_queue_b;
+        let attr_var_init_bindings_b = machine_st.stack.index_or_frame(b).prelude.attr_var_init_bindings_b;
+
+        machine_st.attr_var_init.backtrack(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();
index dea7b4683488fddfc32f680fa501dd950438aac6..a56da366f02205023375cde48cab4cc75bd22bbe 100644 (file)
@@ -3241,8 +3241,10 @@ impl MachineState {
                 or_frame.prelude.pstr_tr = self.pstr_tr;
                 or_frame.prelude.h  = self.heap.h;
                 or_frame.prelude.b0 = self.b0;
-                or_frame.prelude.attr_var_init_b =
+                or_frame.prelude.attr_var_init_queue_b =
                     self.attr_var_init.attr_var_queue.len();
+                or_frame.prelude.attr_var_init_bindings_b =
+                    self.attr_var_init.bindings.len();
 
                 self.b = b;
 
@@ -3278,7 +3280,9 @@ impl MachineState {
                 or_frame.prelude.pstr_tr = self.pstr_tr;
                 or_frame.prelude.h  = self.heap.h;
                 or_frame.prelude.b0 = self.b0;
-                or_frame.prelude.attr_var_init_b =
+                or_frame.prelude.attr_var_init_queue_b =
+                    self.attr_var_init.attr_var_queue.len();
+                or_frame.prelude.attr_var_init_bindings_b =
                     self.attr_var_init.attr_var_queue.len();
 
                 self.b = b;