]> Repositorios git - scryer-prolog.git/commitdiff
evacuate when allocating anon vars
authorMark Thom <[email protected]>
Sun, 24 Feb 2019 20:40:58 +0000 (13:40 -0700)
committerMark Thom <[email protected]>
Sun, 24 Feb 2019 20:40:58 +0000 (13:40 -0700)
src/prolog/allocator.rs
src/prolog/codegen.rs
src/prolog/compile.rs
src/prolog/debray_allocator.rs
src/prolog/lib/between.pl
src/prolog/machine/mod.rs

index a6c74dd5033b3a8f226bdb0d9fe7fa1d0141756c..a498fbaf4799eeee97498c7a242e078f411deef8 100644 (file)
@@ -11,7 +11,7 @@ pub trait Allocator<'a>
 {
     fn new() -> Self;
 
-    fn mark_anon_var<Target>(&mut self, Level, &mut Vec<Target>)
+    fn mark_anon_var<Target>(&mut self, Level, GenContext, &mut Vec<Target>)
         where Target: CompilationTarget<'a>;
     fn mark_non_var<Target>(&mut self, Level, GenContext, &'a Cell<RegType>, &mut Vec<Target>)
         where Target: CompilationTarget<'a>;
index 80ae682462d164d18bf978e5278b862a25f57778..ca4a81ace41ca00b324041c206ad20ccd1f15f1a 100644 (file)
@@ -158,7 +158,7 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<TermMarker>
     {
         match subterm {
             &Term::AnonVar if is_exposed =>
-                self.marker.mark_anon_var(Level::Deep, target),
+                self.marker.mark_anon_var(Level::Deep, term_loc, target),
             &Term::AnonVar =>
                 Self::add_or_increment_void_instr(target),
             &Term::Cons(ref cell, _, _) | &Term::Clause(ref cell, _, _, _) => {
@@ -207,7 +207,7 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<TermMarker>
                     if let GenContext::Head = term_loc {
                         self.marker.advance_arg();
                     } else {
-                        self.marker.mark_anon_var(lvl, &mut target);
+                        self.marker.mark_anon_var(lvl, term_loc, &mut target);
                     },
                 TermRef::Var(lvl @ Level::Shallow, cell, ref var) if var.as_str() == "!" => {
                     if self.marker.is_unbound(var.clone()) {
index 041ee425032c811c5a28d58058ff4a566c000234..f318bb391a8fe27ba74def7bdb56f082bfdfefef 100644 (file)
@@ -257,7 +257,7 @@ impl ListingCompiler {
 
             let idx = code_dir.entry((name.clone(), arity)).or_insert(CodeIndex::default());
             set_code_index!(idx, IndexPtr::Index(p), self.get_module_name());
-
+            
             code.extend(decl_code.into_iter());
         }
 
index adfefc73c43cfe579be16453daf72675a0107370..86053c48031fdd9715f6b9f0af7140d3729be427 100644 (file)
@@ -211,7 +211,7 @@ impl<'a> Allocator<'a> for DebrayAllocator
         }
     }
 
-    fn mark_anon_var<Target>(&mut self, lvl: Level, target: &mut Vec<Target>)
+    fn mark_anon_var<Target>(&mut self, lvl: Level, term_loc: GenContext, target: &mut Vec<Target>)
         where Target: CompilationTarget<'a>
     {
         let r = RegType::Temp(self.alloc_reg_to_non_var());
@@ -220,8 +220,13 @@ impl<'a> Allocator<'a> for DebrayAllocator
             Level::Deep => target.push(Target::subterm_to_variable(r)),
             Level::Root | Level::Shallow => {
                 let k = self.arg_c;
-                self.arg_c += 1;
 
+                if let GenContext::Last(chunk_num) = term_loc {
+                    self.evacuate_arg(chunk_num, target);
+                }
+
+                self.arg_c += 1;
+                
                 target.push(Target::argument_to_variable(r, k));
             }
         };
index b54a4f04e578a6946013526083c56fde33b6269f..78aaf26f3b6bc8f5965466a3b9be33dda4678d9f 100644 (file)
@@ -84,7 +84,7 @@ diag_ints(M, N, M0, N0) :-
     diag_nats_signs(M, N, M0, N0).
 
 diag_ints(M, N) :-
-    diag_ints(M0, N0, M, N).
+    diag_ints(_, _, M, N).
 
 gen_ints(L, U) :-
     can_be(integer, L), can_be(integer, U),
index c2567c4e2be42aba7643fccdf834821c6bf8986a..b74464157b9dfa4caee9cb67f2f007c4958e30e9 100644 (file)
@@ -343,7 +343,7 @@ impl Machine {
     }
 
     fn compile_libraries(&mut self) {
-        compile_user_module(self, LISTS.as_bytes());        
+        compile_user_module(self, LISTS.as_bytes());
         compile_user_module(self, QUEUES.as_bytes());
         compile_user_module(self, ERROR.as_bytes());
         compile_user_module(self, BETWEEN.as_bytes());
@@ -506,7 +506,7 @@ impl Machine {
         for (var, addr) in sorted_vars {
             output = self.machine_st.print_var_eq(var.clone(), addr.clone(), var_dir, output);
         }
-        
+
         output
     }
 
@@ -608,7 +608,7 @@ impl MachineState {
                 _ => {}
             };
         }
-    }    
+    }
 
     fn record_var_places(&self, chunk_num: usize, alloc_locs: &AllocVarDict,
                          heap_locs: &mut HeapVarDict)