From: Mark Thom Date: Sun, 7 Oct 2018 06:43:44 +0000 (-0600) Subject: term_expansion bug fixes X-Git-Tag: v0.8.110~342 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=fa1bb6df3a13741e40b1867d764f275b48008a2a;p=scryer-prolog.git term_expansion bug fixes --- diff --git a/src/prolog/compile.rs b/src/prolog/compile.rs index eff9d2e8..f45cbdc8 100644 --- a/src/prolog/compile.rs +++ b/src/prolog/compile.rs @@ -74,7 +74,8 @@ fn set_first_index(code: &mut Code) } } -fn compile_appendix(code: &mut Code, queue: Vec, non_counted_bt: bool, flags: MachineFlags) +fn compile_appendix(code: &mut Code, queue: &VecDeque, non_counted_bt: bool, + flags: MachineFlags) -> Result<(), ParserError> { for tl in queue.iter() { @@ -85,14 +86,14 @@ fn compile_appendix(code: &mut Code, queue: Vec, non_counted_bt: bool, Ok(()) } -fn compile_query(terms: Vec, queue: Vec, flags: MachineFlags) +fn compile_query(terms: Vec, queue: VecDeque, flags: MachineFlags) -> Result<(Code, AllocVarDict), ParserError> { // count backtracking inferences. let mut cg = CodeGenerator::::new(false, flags); let mut code = try!(cg.compile_query(&terms)); - compile_appendix(&mut code, queue, false, flags)?; + compile_appendix(&mut code, &queue, false, flags)?; Ok((code, cg.take_vars())) } @@ -218,7 +219,7 @@ impl ListingCompiler { let mut decl_code = compile_relation(&TopLevel::Predicate(decl), non_counted_bt, wam.machine_flags())?; - compile_appendix(&mut decl_code, Vec::from(queue), non_counted_bt, wam.machine_flags())?; + compile_appendix(&mut decl_code, &queue, non_counted_bt, wam.machine_flags())?; let idx = code_dir.entry((name, arity)).or_insert(CodeIndex::default()); set_code_index!(idx, IndexPtr::Index(p), self.get_module_name()); @@ -260,14 +261,16 @@ impl ListingCompiler { match decl { Declaration::Hook(CompileTimeHook::TermExpansion, clause, queue) => { let key = (clause_name!("term_expansion"), 2); - let preds = code_repo.term_dir.entry(key).or_insert(Predicate(vec![])); - - preds.0.push(clause); + let preds = code_repo.term_dir.entry(key) + .or_insert((Predicate(vec![]), VecDeque::from(vec![]))); + (preds.0).0.push(clause); + preds.1.extend(queue.into_iter()); + let mut cg = CodeGenerator::::new(false, flags); - let mut code = cg.compile_predicate(&preds.0)?; + let mut code = cg.compile_predicate(&(preds.0).0)?; - compile_appendix(&mut code, Vec::from(queue), false, flags)?; + compile_appendix(&mut code, &preds.1, false, flags)?; Ok(code_repo.term_expanders = code) }, diff --git a/src/prolog/instructions.rs b/src/prolog/instructions.rs index cfba0177..b7be416e 100644 --- a/src/prolog/instructions.rs +++ b/src/prolog/instructions.rs @@ -196,7 +196,7 @@ pub type ModuleCodeDir = HashMap; pub type CodeDir = HashMap; -pub type TermDir = HashMap; +pub type TermDir = HashMap)>; pub type ModuleDir = HashMap; diff --git a/src/prolog/toplevel.rs b/src/prolog/toplevel.rs index 4bcaf691..923fece1 100644 --- a/src/prolog/toplevel.rs +++ b/src/prolog/toplevel.rs @@ -247,8 +247,8 @@ fn is_consistent(tl: &TopLevel, clauses: &Vec) -> bool fn deque_to_packet(head: TopLevel, deque: VecDeque) -> TopLevelPacket { match head { - TopLevel::Query(query) => TopLevelPacket::Query(query, Vec::from(deque)), - tl => TopLevelPacket::Decl(tl, Vec::from(deque)) + TopLevel::Query(query) => TopLevelPacket::Query(query, deque), + tl => TopLevelPacket::Decl(tl, deque) } } @@ -381,8 +381,8 @@ fn module_resolution_call(mod_name: Term, body: Term) -> Result, Vec), - Decl(TopLevel, Vec) + Query(Vec, VecDeque), + Decl(TopLevel, VecDeque) } struct RelationWorker {