]> Repositorios git - scryer-prolog.git/commitdiff
reconcile latest changes against stack changes
authorMark Thom <[email protected]>
Sun, 8 Dec 2019 01:59:03 +0000 (18:59 -0700)
committerMark Thom <[email protected]>
Sun, 8 Dec 2019 01:59:03 +0000 (18:59 -0700)
1  2 
src/prolog/machine/compile.rs
src/prolog/machine/copier.rs
src/prolog/machine/machine_state.rs
src/prolog/machine/machine_state_impl.rs
src/prolog/machine/system_calls.rs

Simple merge
index e7cb9e6e7f52c638f073f96c5af9e5e58d917ddc,13e21ee360c3c734501205b560d526f60aca9fb2..8fe112662ac4a3e1cd9a1fe90a70e0e2bfd74da5
@@@ -10,12 -16,13 +16,13 @@@ pub(crate) trait CopierTarget: IndexMut
      fn push(&mut self, _: HeapCellValue);
      fn store(&self, _: Addr) -> Addr;
      fn deref(&self, _: Addr) -> Addr;
 -    fn stack(&mut self) -> &mut AndStack;
 +    fn stack(&mut self) -> &mut Stack;
  }
  
- pub(crate) fn copy_term<T: CopierTarget>(target: T, addr: Addr) {
-     let mut copy_term_state = CopyTermState::new(target);
-     copy_term_state.copy_term_impl(addr);    
+ pub(crate)
+ fn copy_term<T: CopierTarget>(target: T, addr: Addr, attr_var_policy: AttrVarPolicy) {
+     let mut copy_term_state = CopyTermState::new(target, attr_var_policy);
+     copy_term_state.copy_term_impl(addr);
  }
  
  struct CopyTermState<T: CopierTarget> {
@@@ -114,9 -108,49 +108,49 @@@ impl<T: CopierTarget> CopyTermState<T> 
          self.scan += 1;
      }
  
 -                self.target.stack()[fr][sc] = Addr::HeapCell(frontier);
+     fn reinstantiate_var(&mut self, addr: Addr, frontier: usize) {
+         match addr {
+             Addr::HeapCell(h) => {
+                 self.target[frontier] = HeapCellValue::Addr(Addr::HeapCell(frontier));
+                 self.target[h] = HeapCellValue::Addr(Addr::HeapCell(frontier));
+                 self.trail.push((
+                     Ref::HeapCell(h),
+                     HeapCellValue::Addr(Addr::HeapCell(h)),
+                 ));
+             }
+             Addr::StackCell(fr, sc) => {
+                 self.target[frontier] = HeapCellValue::Addr(Addr::HeapCell(frontier));
++                self.target.stack().index_and_frame_mut(fr)[sc] = Addr::HeapCell(frontier);
+                 self.trail.push((
+                     Ref::StackCell(fr, sc),
+                     HeapCellValue::Addr(Addr::StackCell(fr, sc)),
+                 ));
+             }
+             Addr::AttrVar(h) => {
+                 let threshold = if let AttrVarPolicy::DeepCopy = self.attr_var_policy {
+                     self.target.threshold()
+                 } else {
+                     frontier
+                 };
+                 self.target[frontier] = HeapCellValue::Addr(Addr::HeapCell(threshold));
+                 self.target[h] = HeapCellValue::Addr(Addr::HeapCell(threshold));
+                 self.trail.push((
+                     Ref::AttrVar(h),
+                     HeapCellValue::Addr(Addr::AttrVar(h)),
+                 ));
+                 if let AttrVarPolicy::DeepCopy = self.attr_var_policy {
+                     self.target.push(HeapCellValue::Addr(Addr::AttrVar(threshold)));
+                     let list_val = self.target[h + 1].clone();
+                     self.target.push(list_val);
+                 }
+             }
+             _ => unreachable!()
+         }
+     }
      fn copy_var(&mut self, addr: Addr) {
          let rd = self.target.store(self.target.deref(addr.clone()));
  
index 64c761cd1f6856ccae2bd7a325b6b3bf05e5302b,fddfb264626322c3428902eaf9da145cf32f18d8..1e3086d58cc367feeb0f02af13048e0725cd4dcb
@@@ -439,12 -441,15 +439,15 @@@ pub(crate) trait CallPolicy: Any 
  
          machine_st.pstr_trail.truncate(machine_st.pstr_tr);
  
 -        machine_st.heap.truncate(machine_st.or_stack[b].h);
 +        machine_st.heap.truncate(machine_st.stack.index_or_frame(b).prelude.h);
  
 -        let attr_var_init_queue_b = machine_st.or_stack[b].attr_var_init_queue_b;
 -        let attr_var_init_bindings_b = machine_st.or_stack[b].attr_var_init_bindings_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.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;
          let curr_pstr_tr = machine_st.pstr_tr;
  
          machine_st.unwind_pstr_trail(old_pstr_tr, curr_pstr_tr);
 -        machine_st.pstr_tr = machine_st.or_stack[b].pstr_tr;
 +        machine_st.pstr_tr = machine_st.stack.index_or_frame(b).prelude.pstr_tr;
  
          machine_st.pstr_trail.truncate(machine_st.pstr_tr);
 -        machine_st.heap.truncate(machine_st.or_stack[b].h);
 +        machine_st.heap.truncate(machine_st.stack.index_or_frame(b).prelude.h);
  
 -        let attr_var_init_queue_b = machine_st.or_stack[b].attr_var_init_queue_b;
 -        let attr_var_init_bindings_b = machine_st.or_stack[b].attr_var_init_bindings_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.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;
          let curr_pstr_tr = machine_st.pstr_tr;
  
          machine_st.unwind_pstr_trail(old_pstr_tr, curr_pstr_tr);
 -        machine_st.pstr_tr = machine_st.or_stack[b].pstr_tr;
 +        machine_st.pstr_tr = machine_st.stack.index_or_frame(b).prelude.pstr_tr;
  
          machine_st.pstr_trail.truncate(machine_st.pstr_tr);
 -        machine_st.heap.truncate(machine_st.or_stack[b].h);
 +        machine_st.heap.truncate(machine_st.stack.index_or_frame(b).prelude.h);
  
 -        let attr_var_init_queue_b = machine_st.or_stack[b].attr_var_init_queue_b;
 -        let attr_var_init_bindings_b = machine_st.or_stack[b].attr_var_init_bindings_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.attr_var_init.backtrack(
+             attr_var_init_queue_b,
 -            attr_var_init_bindings_b,
 -        );
++            attr_var_init_bindings_b);
  
 -        machine_st.b = machine_st.or_stack[b].b;
 -        machine_st.or_stack.truncate(machine_st.b);
 +        machine_st.b = machine_st.stack.index_or_frame(b).prelude.b;
 +        machine_st.truncate_stack();
  
          machine_st.hb = machine_st.heap.h;
          machine_st.p += offset;
          let curr_pstr_tr = machine_st.pstr_tr;
  
          machine_st.unwind_pstr_trail(old_pstr_tr, curr_pstr_tr);
 +        machine_st.pstr_tr = machine_st.stack.index_or_frame(b).prelude.pstr_tr;
  
 -        machine_st.pstr_tr = machine_st.or_stack[b].pstr_tr;
++        machine_st.pstr_tr = machine_st.stack.index_or_frame(b).prelude.pstr_tr;
          machine_st.pstr_trail.truncate(machine_st.pstr_tr);
  
 -        machine_st.heap.truncate(machine_st.or_stack[b].h);
 +        machine_st.heap.truncate(machine_st.stack.index_or_frame(b).prelude.h);
  
 -        let attr_var_init_queue_b = machine_st.or_stack[b].attr_var_init_queue_b;
 -        let attr_var_init_bindings_b = machine_st.or_stack[b].attr_var_init_bindings_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.attr_var_init.backtrack(
+             attr_var_init_queue_b,
 -            attr_var_init_bindings_b,
++            attr_var_init_bindings_b
+         );
  
 -        machine_st.b = machine_st.or_stack[b].b;
 -        machine_st.or_stack.truncate(machine_st.b);
 +        machine_st.b = machine_st.stack.index_or_frame(b).prelude.b;
 +        machine_st.truncate_stack();
-         
          machine_st.hb = machine_st.heap.h;
          machine_st.p += 1;
  
index a56da366f02205023375cde48cab4cc75bd22bbe,63ace01f2c7caee48518a857d601ebb539af9b79..a23a43579d6fe4ba821001e4b0dee834796c7cd9
@@@ -2005,11 -2037,15 +2005,15 @@@ impl MachineState 
      }
  
      pub(super) fn set_ball(&mut self) {
+         self.ball.reset();
          let addr = self[temp_v!(1)].clone();
          self.ball.boundary = self.heap.h;
          copy_term(
 -            CopyBallTerm::new(&mut self.and_stack, &mut self.heap, &mut self.ball.stub),
 +            CopyBallTerm::new(&mut self.stack, &mut self.heap, &mut self.ball.stub),
              addr,
+             AttrVarPolicy::DeepCopy,
          );
      }
  
index 89fbde2d9e437a57bf46a4c02252505f2051468a,2fb652d40ce3d9b883c5d364472e1f9b8deba171..fb702df32977c71743dd5953af5e8a9b121fc708
@@@ -1674,8 -1699,9 +1708,9 @@@ impl MachineState 
  
                  ball.boundary = h;
                  copy_term(
 -                    CopyBallTerm::new(&mut self.and_stack, &mut self.heap, &mut ball.stub),
 +                    CopyBallTerm::new(&mut self.stack, &mut self.heap, &mut ball.stub),
                      value,
+                     AttrVarPolicy::DeepCopy,
                  );
  
                  let offset = self[temp_v!(3)].clone();
  
                  ball.boundary = self.heap.h;
                  copy_term(
 -                    CopyBallTerm::new(&mut self.and_stack, &mut self.heap, &mut ball.stub),
 +                    CopyBallTerm::new(&mut self.stack, &mut self.heap, &mut ball.stub),
                      value,
+                     AttrVarPolicy::DeepCopy,
                  );
  
                  indices.global_variables.insert(key, (ball, None));
  
                  ball.boundary = h;
                  copy_term(
 -                    CopyBallTerm::new(&mut self.and_stack, &mut self.heap, &mut ball.stub),
 +                    CopyBallTerm::new(&mut self.stack, &mut self.heap, &mut ball.stub),
                      value.clone(),
+                     AttrVarPolicy::DeepCopy,
                  );
  
                  let stub = ball.copy_and_align(h);