]> Repositorios git - scryer-prolog.git/commitdiff
fix permanent variable handling over branches and cells (#2154)
authorMark Thom <[email protected]>
Sat, 11 Nov 2023 16:20:22 +0000 (17:20 +0100)
committerMark Thom <[email protected]>
Sat, 11 Nov 2023 16:20:22 +0000 (17:20 +0100)
src/codegen.rs
src/debray_allocator.rs

index ae4756836c397fcdbb74f4bcf3b64eb5d4cc1a47..21fd4e4d15f4bcbc45e11a924e098789df41d794 100644 (file)
@@ -10,6 +10,7 @@ use crate::parser::ast::*;
 use crate::targets::*;
 use crate::temp_v;
 use crate::types::*;
+use crate::variable_records::*;
 
 use crate::instr;
 use crate::machine::disjuncts::*;
@@ -277,7 +278,6 @@ impl DebrayAllocator {
         code: &mut CodeDeque,
     ) -> RegType {
         self.mark_var::<QueryInstruction>(var_num, Level::Shallow, vr, term_loc, code);
-
         vr.get().norm()
     }
 
@@ -296,6 +296,13 @@ impl DebrayAllocator {
                     self.mark_var_in_non_callable(var_num, term_loc, vr, code);
                     temp_v!(arg)
                 } else {
+                   match &self.var_data.records[var_num].allocation {
+                       VarAlloc::Perm(_, PermVarAllocation::Pending) => {
+                           self.mark_var_in_non_callable(var_num, term_loc, vr, code);
+                       }
+                       _ => {}
+                   }
+
                     self.increment_running_count(var_num);
                     RegType::Perm(p)
                 }
index 01ec4da79a9a310e51b010908269e2514fa5193f..89ef44f3d9a348c0045635bef6a7edc192e6249a 100644 (file)
@@ -189,7 +189,6 @@ impl DebrayAllocator {
                             }
                         }
                         _ => {
-                            unreachable!();
                         }
                     }
 
@@ -474,7 +473,7 @@ impl DebrayAllocator {
 
     #[inline(always)]
     pub fn get_binding(&self, var_num: usize) -> RegType {
-        self.var_data.records[var_num].allocation.as_reg_type()
+       self.var_data.records[var_num].allocation.as_reg_type()
     }
 
     pub fn num_perm_vars(&self) -> usize {
@@ -748,11 +747,11 @@ impl Allocator for DebrayAllocator {
             RegType::Temp(0) => {
                 let o = self.alloc_reg_to_var::<Target>(var_num, lvl, term_loc, code);
                 cell.set(VarReg::Norm(RegType::Temp(o)));
-
                 (RegType::Temp(o), true)
             }
             RegType::Perm(0) => {
                 let p = self.alloc_perm_var(var_num, term_loc.chunk_num());
+               cell.set(VarReg::Norm(RegType::Perm(p)));
                 (RegType::Perm(p), true)
             }
             r @ RegType::Perm(_) => {