From: Mark Thom Date: Sun, 12 Nov 2017 00:32:46 +0000 (-0700) Subject: get rid of chunked iterators for facts. X-Git-Tag: v0.8.110~673 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=1f19d5de95f6c3f7d2b554ed7553d7b32e23d290;p=scryer-prolog.git get rid of chunked iterators for facts. --- diff --git a/src/prolog/codegen.rs b/src/prolog/codegen.rs index 0a6b7851..6d281c27 100644 --- a/src/prolog/codegen.rs +++ b/src/prolog/codegen.rs @@ -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(); diff --git a/src/prolog/fixtures.rs b/src/prolog/fixtures.rs index a726835e..1d40ce29 100644 --- a/src/prolog/fixtures.rs +++ b/src/prolog/fixtures.rs @@ -173,11 +173,11 @@ impl<'a> VariableFixtures<'a> pub fn mark_vars_in_chunk(&mut self, iter: Iter, - last_term_arity: usize, - chunk_num: usize, + last_term_arity: usize, term_loc: GenContext) where Iter: Iterator> { + let chunk_num = term_loc.chunk_num(); let mut arg_c = 1; for term_ref in iter { diff --git a/src/prolog/iterators.rs b/src/prolog/iterators.rs index 6fa0f323..24af15b6 100644 --- a/src/prolog/iterators.rs +++ b/src/prolog/iterators.rs @@ -200,18 +200,6 @@ pub struct ChunkedIterator<'a> impl<'a> ChunkedIterator<'a> { - pub fn from_fact(term: &'a Term) -> Self - { - let inner_iter: Box>> = - 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());