]> Repositorios git - scryer-prolog.git/commitdiff
get rid of chunked iterators for facts.
authorMark Thom <[email protected]>
Sun, 12 Nov 2017 00:32:46 +0000 (17:32 -0700)
committerMark Thom <[email protected]>
Sun, 12 Nov 2017 00:32:46 +0000 (17:32 -0700)
src/prolog/codegen.rs
src/prolog/fixtures.rs
src/prolog/iterators.rs

index 0a6b7851a9679737fbf017297c7c84775445268c..6d281c2767cf643d988a39882d2d001c2b76d332 100644 (file)
@@ -194,7 +194,6 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<'a, TermMarker>
                 self.update_var_count(term_or_cut_ref.post_order_iter());
                 vs.mark_vars_in_chunk(term_or_cut_ref.post_order_iter(),
                                       last_term_arity,
-                                      chunk_num,
                                       term_loc);
             }
         }
@@ -242,7 +241,7 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<'a, TermMarker>
         if let Some(&mut Line::Control(ref mut ctrl)) = code.last_mut() {
             let mut instr = ControlInstruction::Proceed;
             swap(ctrl, &mut instr);
-            
+
             match instr {
                 ControlInstruction::Call(name, arity, _) =>
                     *ctrl = ControlInstruction::Execute(name, arity),
@@ -257,7 +256,7 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<'a, TermMarker>
                 _ => dealloc_index += 1 // = code.len()
             }
         }
-        
+
         dealloc_index
     }
 
@@ -429,7 +428,7 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<'a, TermMarker>
                 code.push(proceed!()),
             _ => {}
         }
-        
+
         let dealloc_index = Self::lco(code);
 
         if conjunct_info.allocates() {
@@ -501,9 +500,14 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<'a, TermMarker>
 
     pub fn compile_fact<'b: 'a>(&mut self, term: &'b Term) -> Code
     {
-        let iter = ChunkedIterator::from_fact(term);
+        self.update_var_count(term.post_order_iter());
+
+        let mut vs = VariableFixtures::new();
+        vs.mark_vars_in_chunk(term.post_order_iter(), term.arity(), GenContext::Head);
+
+        vs.populate_restricting_sets();
 
-        self.collect_var_data(iter);
+        self.marker.drain_var_data(vs);
         self.marker.advance(GenContext::Head, term.arity());
 
         let mut code = Vec::new();
index a726835efe3ed677ef1fc372a5516c4446bbf335..1d40ce29d6d951b693ea239aaae3e76b47e95dd4 100644 (file)
@@ -173,11 +173,11 @@ impl<'a> VariableFixtures<'a>
 
     pub fn mark_vars_in_chunk<Iter>(&mut self,
                                     iter: Iter,
-                                    last_term_arity: usize,
-                                    chunk_num: usize,
+                                    last_term_arity: usize,                                    
                                     term_loc: GenContext)
         where Iter: Iterator<Item=TermRef<'a>>
     {
+        let chunk_num = term_loc.chunk_num();
         let mut arg_c = 1;
 
         for term_ref in iter {
index 6fa0f323910aa0c00acec8ea981e85cac5fad642..24af15b6adba6664fb128feba4951f532e33f28d 100644 (file)
@@ -200,18 +200,6 @@ pub struct ChunkedIterator<'a>
 
 impl<'a> ChunkedIterator<'a>
 {
-    pub fn from_fact(term: &'a Term) -> Self
-    {
-        let inner_iter: Box<Iterator<Item=QueryTermRef<'a>>> =
-            Box::new(once(QueryTermRef::Term(term)));
-
-        ChunkedIterator {
-            term_loc: GenContext::Head,
-            iter: inner_iter,
-            deep_cut_encountered: false,
-        }
-    }
-
     pub fn from_term_sequence(terms: &'a [QueryTerm]) -> Self
     {
         let iter = terms.iter().map(|c| c.to_ref());