track attr_var_init lengths on the stack (#1667)

This commit is contained in:
Mark Thom
2022-12-16 00:42:31 -07:00
parent 1eff758751
commit cf63e8375d
8 changed files with 15 additions and 21 deletions

View File

@@ -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(_) |

View File

@@ -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]) :-

View File

@@ -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();
}
}

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;

View File

@@ -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)]

View File

@@ -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;