]> Repositorios git - scryer-prolog.git/commitdiff
track attr_var_init lengths on the stack (#1667)
authorMark Thom <[email protected]>
Fri, 16 Dec 2022 07:42:31 +0000 (00:42 -0700)
committerMark Thom <[email protected]>
Sat, 17 Dec 2022 03:10:17 +0000 (20:10 -0700)
build/instructions_template.rs
src/machine/attributed_variables.pl
src/machine/attributed_variables.rs
src/machine/dispatch.rs
src/machine/machine_state.rs
src/machine/mod.rs
src/machine/stack.rs
src/machine/system_calls.rs

index 8bc5d6309fa0f17f52277c3b8d5c4a516d163d2b..3780f2c9d42593cc5d6b83165ac060a210cff929 100644 (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(_) |
index 982ec49566970e34619949c036d92c22fc97a6c9..c288511b66d6893bf12a39521faebb4f25401fb1 100644 (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]) :-
index b11cf34cff2a4c5d714b7d16740edc40470d0999..2bab7451b6334447c54e209765afed4fb168a795 100644 (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();
     }
 }
index c9db5966c86a9fbc501d76b9cc4f1250fbd2c047..72da8bad2e23df439436baf8a120f29be9d6cf3e 100644 (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);
index 6aa5191674f0344bb9c8706a23e7316d079a01eb..2db02c01762c58f73b25c4ee47ead5f4ea9cc62f 100644 (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;
 
index 4cd1fce83d84abdc2194699a28900a2a95ad9895..164471f46396d062786eaa8a1be53c8f1aba8478 100644 (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;
index 388c3008203d4764f57083901d714ab1d9b24da8..47a4fbf4d0369d5d2a197ac806c5bc23e312fab8 100644 (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)]
index c70c4decc98c433eb2896bfbb4fc734d4435e21a..3517f76b0d54cdfe9e14873b6745bed1c98aa212 100644 (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;