From: Mark Thom Date: Fri, 16 Dec 2022 07:42:31 +0000 (-0700) Subject: track attr_var_init lengths on the stack (#1667) X-Git-Tag: v0.9.2~248 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=cf63e8375d810687f8cfa84ce10bc4570693465e;p=scryer-prolog.git track attr_var_init lengths on the stack (#1667) --- diff --git a/build/instructions_template.rs b/build/instructions_template.rs index 8bc5d630..3780f2c9 100644 --- a/build/instructions_template.rs +++ b/build/instructions_template.rs @@ -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(_) | diff --git a/src/machine/attributed_variables.pl b/src/machine/attributed_variables.pl index 982ec495..c288511b 100644 --- a/src/machine/attributed_variables.pl +++ b/src/machine/attributed_variables.pl @@ -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]) :- diff --git a/src/machine/attributed_variables.rs b/src/machine/attributed_variables.rs index b11cf34c..2bab7451 100644 --- a/src/machine/attributed_variables.rs +++ b/src/machine/attributed_variables.rs @@ -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(); } } diff --git a/src/machine/dispatch.rs b/src/machine/dispatch.rs index c9db5966..72da8bad 100644 --- a/src/machine/dispatch.rs +++ b/src/machine/dispatch.rs @@ -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); diff --git a/src/machine/machine_state.rs b/src/machine/machine_state.rs index 6aa51916..2db02c01 100644 --- a/src/machine/machine_state.rs +++ b/src/machine/machine_state.rs @@ -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; diff --git a/src/machine/mod.rs b/src/machine/mod.rs index 4cd1fce8..164471f4 100644 --- a/src/machine/mod.rs +++ b/src/machine/mod.rs @@ -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; diff --git a/src/machine/stack.rs b/src/machine/stack.rs index 388c3008..47a4fbf4 100644 --- a/src/machine/stack.rs +++ b/src/machine/stack.rs @@ -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)] diff --git a/src/machine/system_calls.rs b/src/machine/system_calls.rs index c70c4dec..3517f76b 100644 --- a/src/machine/system_calls.rs +++ b/src/machine/system_calls.rs @@ -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;