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