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);
}
.bindings
.iter()
.map(|(ref h, _)| Addr::AttrVar(*h));
+
let var_list_addr = Addr::HeapCell(self.heap.to_list(iter));
let iter = self
.bindings
.iter()
.map(|(_, ref addr)| addr.clone());
+
let value_list_addr = Addr::HeapCell(self.heap.to_list(iter));
(var_list_addr, value_list_addr)
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;
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;
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();
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();
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;
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;