GetCode,
#[strum_discriminants(strum(props(Arity = "1", Name = "$get_single_char")))]
GetSingleChar,
- #[strum_discriminants(strum(props(Arity = "0", Name = "$reset_attr_var_state")))]
- ResetAttrVarState,
#[strum_discriminants(strum(props(Arity = "2", Name = "$truncate_if_no_lh_growth_diff")))]
TruncateIfNoLiftedHeapGrowthDiff,
#[strum_discriminants(strum(props(Arity = "1", Name = "$truncate_if_no_lh_growth")))]
&Instruction::CallGetNChars(_) |
&Instruction::CallGetCode(_) |
&Instruction::CallGetSingleChar(_) |
- &Instruction::CallResetAttrVarState(_) |
&Instruction::CallTruncateIfNoLiftedHeapGrowthDiff(_) |
&Instruction::CallTruncateIfNoLiftedHeapGrowth(_) |
&Instruction::CallGetAttributedVariableList(_) |
&Instruction::ExecuteGetNChars(_) |
&Instruction::ExecuteGetCode(_) |
&Instruction::ExecuteGetSingleChar(_) |
- &Instruction::ExecuteResetAttrVarState(_) |
&Instruction::ExecuteTruncateIfNoLiftedHeapGrowthDiff(_) |
&Instruction::ExecuteTruncateIfNoLiftedHeapGrowth(_) |
&Instruction::ExecuteGetAttributedVariableList(_) |
iterate(Vars, Values, ListOfListsOfGoalLists),
!,
call_goals(ListOfListsOfGoalLists),
- '$reset_attr_var_state',
'$return_from_verify_attr'.
iterate([Var|VarBindings], [Value|ValueBindings], [ListOfGoalLists | ListsCubed]) :-
}
#[inline]
- pub(super) fn reset(&mut self) {
- self.attr_var_queue.clear();
+ pub(super) fn reset(&mut self, len: usize) {
+ self.attr_var_queue.truncate(len);
self.bindings.clear();
}
}
try_or_throw!(self.machine_st, self.get_single_char());
step_or_fail!(self, self.machine_st.p = self.machine_st.cp);
}
- &Instruction::CallResetAttrVarState(_) => {
- self.reset_attr_var_state();
- self.machine_st.p += 1;
- }
- &Instruction::ExecuteResetAttrVarState(_) => {
- self.reset_attr_var_state();
- self.machine_st.p = self.machine_st.cp;
- }
&Instruction::CallTruncateIfNoLiftedHeapGrowthDiff(_) => {
self.truncate_if_no_lifted_heap_growth_diff();
step_or_fail!(self, self.machine_st.p += 1);
or_frame.prelude.tr = self.tr;
or_frame.prelude.h = self.heap.len();
or_frame.prelude.b0 = self.b0;
+ or_frame.prelude.attr_var_queue_len = self.attr_var_init.attr_var_queue.len();
self.b = b;
or_frame.prelude.tr = self.tr;
or_frame.prelude.h = self.heap.len();
or_frame.prelude.b0 = self.b0;
+ or_frame.prelude.attr_var_queue_len = self.attr_var_init.attr_var_queue.len();
self.b = b;
let old_tr = or_frame.prelude.tr;
let curr_tr = self.machine_st.tr;
let target_h = or_frame.prelude.h;
+ let attr_var_queue_len = or_frame.prelude.attr_var_queue_len;
self.machine_st.tr = or_frame.prelude.tr;
+ self.reset_attr_var_state(attr_var_queue_len);
- self.reset_attr_var_state();
self.machine_st.hb = target_h;
self.unwind_trail(old_tr, curr_tr);
let old_tr = or_frame.prelude.tr;
let curr_tr = self.machine_st.tr;
let target_h = or_frame.prelude.h;
+ let attr_var_queue_len = or_frame.prelude.attr_var_queue_len;
self.machine_st.tr = or_frame.prelude.tr;
- self.reset_attr_var_state();
+ self.reset_attr_var_state(attr_var_queue_len);
self.machine_st.hb = target_h;
self.machine_st.p = self.machine_st.p + offset;
self.machine_st.tr = or_frame.prelude.tr;
self.machine_st.b = or_frame.prelude.b;
- self.reset_attr_var_state();
+ self.reset_attr_var_state(or_frame.prelude.attr_var_queue_len);
self.machine_st.hb = target_h;
self.machine_st.p = self.machine_st.p + offset;
self.machine_st.tr = or_frame.prelude.tr;
self.machine_st.b = or_frame.prelude.b;
- self.reset_attr_var_state();
+ self.reset_attr_var_state(or_frame.prelude.attr_var_queue_len);
self.machine_st.hb = target_h;
self.machine_st.p += 1;
pub(crate) tr: usize,
pub(crate) h: usize,
pub(crate) b0: usize,
+ pub(crate) attr_var_queue_len: usize,
}
#[derive(Debug)]
}
#[inline(always)]
- pub(crate) fn reset_attr_var_state(&mut self) {
+ pub(crate) fn reset_attr_var_state(&mut self, queue_len: usize) {
self.restore_instr_at_verify_attr_interrupt();
- self.machine_st.attr_var_init.reset();
+ self.machine_st.attr_var_init.reset(queue_len);
}
#[inline(always)]
#[inline(always)]
pub(crate) fn return_from_verify_attr(&mut self) {
+ self.restore_instr_at_verify_attr_interrupt();
+
let e = self.machine_st.e;
let frame_len = self.machine_st.stack.index_and_frame(e).prelude.univ_prelude.num_cells;