]> Repositorios git - scryer-prolog.git/commitdiff
allocate cut variables properly (#2183)
authorMark <[email protected]>
Tue, 28 Nov 2023 21:38:48 +0000 (14:38 -0700)
committerMark <[email protected]>
Tue, 28 Nov 2023 21:38:48 +0000 (14:38 -0700)
src/allocator.rs
src/codegen.rs
src/debray_allocator.rs

index c2300f90fb28e820f71de9f00586fdc08a58490b..e20bf2cfde795b07ecf136d6054e4368debd1969 100644 (file)
@@ -36,12 +36,7 @@ pub(crate) trait Allocator {
         is_new_var: bool,
     );
 
-    fn mark_cut_var<'a, Target: CompilationTarget<'a>>(
-        &mut self,
-        var_num: usize,
-        term_loc: GenContext,
-        code: &mut CodeDeque,
-    ) -> RegType;
+    fn mark_cut_var(&mut self, var_num: usize, chunk_num: usize) -> RegType;
 
     fn mark_var<'a, Target: CompilationTarget<'a>>(
         &mut self,
index 993a122e6b701d4828c112655d62e4d06d820193..09722fbd37e4f5a55ba961dab9371ceb9a785d44 100644 (file)
@@ -926,16 +926,12 @@ impl<'b> CodeGenerator<'b> {
                         match term {
                             &QueryTerm::GetLevel(var_num) => {
                                 let code = branch_code_stack.code(code);
-                                let r = self
-                                    .marker
-                                    .mark_cut_var::<QueryInstruction>(var_num, term_loc, code);
+                                let r = self.marker.mark_cut_var(var_num, chunk_num);
                                 code.push_back(instr!("get_level", r));
                             }
                             &QueryTerm::GetCutPoint { var_num, prev_b } => {
                                 let code = branch_code_stack.code(code);
-                                let r = self
-                                    .marker
-                                    .mark_cut_var::<FactInstruction>(var_num, term_loc, code);
+                                let r = self.marker.mark_cut_var(var_num, chunk_num);
 
                                 code.push_back(if prev_b {
                                     instr!("get_prev_level", r)
index 7154cea72e2ed4165df1f417b6d70ae71bf05266..8bf858c3a8757e66b8525ccf7e355d6dd5967d85 100644 (file)
@@ -840,18 +840,23 @@ impl Allocator for DebrayAllocator {
         self.in_use.insert(o);
     }
 
-    fn mark_cut_var<'a, Target: CompilationTarget<'a>>(
-        &mut self,
-        var_num: usize,
-        term_loc: GenContext,
-        code: &mut CodeDeque,
-    ) -> RegType {
+    fn mark_cut_var(&mut self, var_num: usize, chunk_num: usize) -> RegType {
         match self.get_binding(var_num) {
-            RegType::Perm(0) => RegType::Perm(self.alloc_perm_var(var_num, term_loc.chunk_num())),
+            RegType::Perm(0) => RegType::Perm(self.alloc_perm_var(var_num, chunk_num)),
             RegType::Temp(0) => {
-                let cell = Cell::default();
-                self.mark_var::<Target>(var_num, Level::Shallow, &cell, term_loc, code);
-                cell.get().norm()
+                let t = self.alloc_reg_to_non_var();
+
+                match &mut self.var_data.records[var_num].allocation {
+                    VarAlloc::Temp {
+                        temp_reg, safety, ..
+                    } => {
+                        *temp_reg = t;
+                        *safety = VarSafetyStatus::GloballyUnneeded;
+                    }
+                    _ => unreachable!(),
+                };
+
+                RegType::Temp(t)
             }
             r => r,
         }