From: Mark Thom Date: Sun, 8 Dec 2019 01:59:03 +0000 (-0700) Subject: reconcile latest changes against stack changes X-Git-Tag: v0.8.118~36 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=d6e75110a578c0e388b5c57d208a2e11df71b31d;p=scryer-prolog.git reconcile latest changes against stack changes --- d6e75110a578c0e388b5c57d208a2e11df71b31d diff --cc src/prolog/machine/copier.rs index e7cb9e6e,13e21ee3..8fe11266 --- a/src/prolog/machine/copier.rs +++ b/src/prolog/machine/copier.rs @@@ -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(target: T, addr: Addr) { - let mut copy_term_state = CopyTermState::new(target); - copy_term_state.copy_term_impl(addr); + pub(crate) + fn copy_term(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 { @@@ -114,9 -108,49 +108,49 @@@ impl CopyTermState self.scan += 1; } + 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()[fr][sc] = 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())); diff --cc src/prolog/machine/machine_state.rs index 64c761cd,fddfb264..1e3086d5 --- a/src/prolog/machine/machine_state.rs +++ b/src/prolog/machine/machine_state.rs @@@ -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; @@@ -478,16 -483,18 +481,15 @@@ 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; @@@ -519,19 -530,21 +521,20 @@@ 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; @@@ -563,20 -580,23 +566,24 @@@ 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; diff --cc src/prolog/machine/machine_state_impl.rs index a56da366,63ace01f..a23a4357 --- a/src/prolog/machine/machine_state_impl.rs +++ b/src/prolog/machine/machine_state_impl.rs @@@ -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, ); } diff --cc src/prolog/machine/system_calls.rs index 89fbde2d,2fb652d4..fb702df3 --- a/src/prolog/machine/system_calls.rs +++ b/src/prolog/machine/system_calls.rs @@@ -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(); @@@ -1979,8 -2003,9 +2014,9 @@@ 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)); @@@ -1999,8 -2024,9 +2035,9 @@@ 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);