]> Repositorios git - scryer-prolog.git/commitdiff
allocate cut variables as temporaries when in non-allocating clause (#2183)
authorMark <[email protected]>
Tue, 28 Nov 2023 19:58:54 +0000 (12:58 -0700)
committerMark <[email protected]>
Tue, 28 Nov 2023 19:58:54 +0000 (12:58 -0700)
src/allocator.rs
src/codegen.rs
src/debray_allocator.rs

index e45c36b6594d6c0ac28fbb12a556aed3affab904..c2300f90fb28e820f71de9f00586fdc08a58490b 100644 (file)
@@ -29,20 +29,25 @@ pub(crate) trait Allocator {
         &mut self,
         var_num: usize,
         lvl: Level,
-        cell: &'a Cell<VarReg>,
+        cell: &Cell<VarReg>,
         term_loc: GenContext,
         code: &mut CodeDeque,
         r: RegType,
         is_new_var: bool,
     );
 
-    fn mark_cut_var(&mut self, var_num: usize, chunk_num: usize) -> RegType;
+    fn mark_cut_var<'a, Target: CompilationTarget<'a>>(
+        &mut self,
+        var_num: usize,
+        term_loc: GenContext,
+        code: &mut CodeDeque,
+    ) -> RegType;
 
     fn mark_var<'a, Target: CompilationTarget<'a>>(
         &mut self,
         var_num: usize,
         lvl: Level,
-        cell: &'a Cell<VarReg>,
+        cell: &Cell<VarReg>,
         context: GenContext,
         code: &mut CodeDeque,
     );
index 09722fbd37e4f5a55ba961dab9371ceb9a785d44..993a122e6b701d4828c112655d62e4d06d820193 100644 (file)
@@ -926,12 +926,16 @@ impl<'b> CodeGenerator<'b> {
                         match term {
                             &QueryTerm::GetLevel(var_num) => {
                                 let code = branch_code_stack.code(code);
-                                let r = self.marker.mark_cut_var(var_num, chunk_num);
+                                let r = self
+                                    .marker
+                                    .mark_cut_var::<QueryInstruction>(var_num, term_loc, code);
                                 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(var_num, chunk_num);
+                                let r = self
+                                    .marker
+                                    .mark_cut_var::<FactInstruction>(var_num, term_loc, code);
 
                                 code.push_back(if prev_b {
                                     instr!("get_prev_level", r)
index 593e584aee91483f3d06d9d77cadf53a9f1c0ad6..7154cea72e2ed4165df1f417b6d70ae71bf05266 100644 (file)
@@ -736,7 +736,7 @@ impl Allocator for DebrayAllocator {
         &mut self,
         var_num: usize,
         lvl: Level,
-        cell: &'a Cell<VarReg>,
+        cell: &Cell<VarReg>,
         term_loc: GenContext,
         code: &mut CodeDeque,
     ) {
@@ -776,7 +776,7 @@ impl Allocator for DebrayAllocator {
         &mut self,
         var_num: usize,
         lvl: Level,
-        cell: &'a Cell<VarReg>,
+        cell: &Cell<VarReg>,
         term_loc: GenContext,
         code: &mut CodeDeque,
         r: RegType,
@@ -840,10 +840,18 @@ impl Allocator for DebrayAllocator {
         self.in_use.insert(o);
     }
 
-    fn mark_cut_var(&mut self, var_num: usize, chunk_num: usize) -> RegType {
+    fn mark_cut_var<'a, Target: CompilationTarget<'a>>(
+        &mut self,
+        var_num: usize,
+        term_loc: GenContext,
+        code: &mut CodeDeque,
+    ) -> RegType {
         match self.get_binding(var_num) {
-            RegType::Perm(0) | RegType::Temp(0) => {
-                RegType::Perm(self.alloc_perm_var(var_num, chunk_num))
+            RegType::Perm(0) => RegType::Perm(self.alloc_perm_var(var_num, term_loc.chunk_num())),
+            RegType::Temp(0) => {
+                let cell = Cell::default();
+                self.mark_var::<Target>(var_num, Level::Shallow, &cell, term_loc, code);
+                cell.get().norm()
             }
             r => r,
         }