track attr_var_init lengths on the stack (#1667)
This commit is contained in:
@@ -296,8 +296,6 @@ enum SystemClauseType {
|
||||
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")))]
|
||||
@@ -1628,7 +1626,6 @@ fn generate_instruction_preface() -> TokenStream {
|
||||
&Instruction::CallGetNChars(_) |
|
||||
&Instruction::CallGetCode(_) |
|
||||
&Instruction::CallGetSingleChar(_) |
|
||||
&Instruction::CallResetAttrVarState(_) |
|
||||
&Instruction::CallTruncateIfNoLiftedHeapGrowthDiff(_) |
|
||||
&Instruction::CallTruncateIfNoLiftedHeapGrowth(_) |
|
||||
&Instruction::CallGetAttributedVariableList(_) |
|
||||
@@ -1841,7 +1838,6 @@ fn generate_instruction_preface() -> TokenStream {
|
||||
&Instruction::ExecuteGetNChars(_) |
|
||||
&Instruction::ExecuteGetCode(_) |
|
||||
&Instruction::ExecuteGetSingleChar(_) |
|
||||
&Instruction::ExecuteResetAttrVarState(_) |
|
||||
&Instruction::ExecuteTruncateIfNoLiftedHeapGrowthDiff(_) |
|
||||
&Instruction::ExecuteTruncateIfNoLiftedHeapGrowth(_) |
|
||||
&Instruction::ExecuteGetAttributedVariableList(_) |
|
||||
|
||||
@@ -4,7 +4,6 @@ driver(Vars, Values) :-
|
||||
iterate(Vars, Values, ListOfListsOfGoalLists),
|
||||
!,
|
||||
call_goals(ListOfListsOfGoalLists),
|
||||
'$reset_attr_var_state',
|
||||
'$return_from_verify_attr'.
|
||||
|
||||
iterate([Var|VarBindings], [Value|ValueBindings], [ListOfGoalLists | ListsCubed]) :-
|
||||
|
||||
@@ -33,8 +33,8 @@ impl AttrVarInitializer {
|
||||
}
|
||||
|
||||
#[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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3683,14 +3683,6 @@ impl Machine {
|
||||
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);
|
||||
|
||||
@@ -849,6 +849,7 @@ impl MachineState {
|
||||
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;
|
||||
|
||||
@@ -876,6 +877,7 @@ impl MachineState {
|
||||
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;
|
||||
|
||||
|
||||
@@ -570,10 +570,11 @@ impl Machine {
|
||||
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);
|
||||
@@ -603,9 +604,10 @@ impl Machine {
|
||||
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;
|
||||
@@ -640,7 +642,7 @@ impl Machine {
|
||||
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;
|
||||
@@ -676,7 +678,7 @@ impl Machine {
|
||||
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;
|
||||
|
||||
@@ -123,6 +123,7 @@ pub(crate) struct OrFramePrelude {
|
||||
pub(crate) tr: usize,
|
||||
pub(crate) h: usize,
|
||||
pub(crate) b0: usize,
|
||||
pub(crate) attr_var_queue_len: usize,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
|
||||
@@ -4623,9 +4623,9 @@ impl Machine {
|
||||
}
|
||||
|
||||
#[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)]
|
||||
@@ -4653,6 +4653,8 @@ impl Machine {
|
||||
|
||||
#[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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user