From: Mark Thom Date: Mon, 8 Oct 2018 06:34:08 +0000 (-0600) Subject: fix bug with mark_non_var X-Git-Tag: v0.8.110~341 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=398d91576c3e8332f0c670f8ce2da5954571569c;p=scryer-prolog.git fix bug with mark_non_var --- diff --git a/README.md b/README.md index 60591bc8..7fb1e25e 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Extend rusty-wam to include the following, among other features: - A representation of 'partial strings' as difference lists of characters (_done_). * `term_expansion/2` and `goal_expansion/2` (_in progress_). -* Definite Clause Grammars. +* Definite Clause Grammars (_in progress_). * Attributed variables using the SICStus Prolog interface and semantics. Adding coroutines like `dif/2`, `freeze/2`, etc. is straightforward with attributed variables. diff --git a/src/prolog/compile.rs b/src/prolog/compile.rs index f45cbdc8..8ef35af2 100644 --- a/src/prolog/compile.rs +++ b/src/prolog/compile.rs @@ -220,7 +220,7 @@ impl ListingCompiler { 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()); @@ -271,7 +271,7 @@ impl ListingCompiler { let mut code = cg.compile_predicate(&(preds.0).0)?; compile_appendix(&mut code, &preds.1, false, flags)?; - + Ok(code_repo.term_expanders = code) }, Declaration::NonCountedBacktracking(name, arity) => @@ -351,7 +351,7 @@ fn compile_listing(wam: &mut Machine, src: R, mut indices: IndexStore) try_eval_session!(compiler.add_code(wam, module_code, indices)); try_eval_session!(compiler.add_code(wam, toplvl_code, results.toplevel_indices)); - + EvalSession::EntrySuccess } diff --git a/src/prolog/debray_allocator.rs b/src/prolog/debray_allocator.rs index 549cbb33..e94b8fc6 100644 --- a/src/prolog/debray_allocator.rs +++ b/src/prolog/debray_allocator.rs @@ -231,24 +231,23 @@ impl<'a> Allocator<'a> for DebrayAllocator where Target: CompilationTarget<'a> { let r = cell.get(); + + let r = match lvl { + Level::Shallow => { + let k = self.arg_c; + + if let GenContext::Last(chunk_num) = term_loc { + self.evacuate_arg(chunk_num, target); + } + + self.arg_c += 1; + RegType::Temp(k) + }, + _ if r.reg_num() == 0 => RegType::Temp(self.alloc_reg_to_non_var()), + _ => r + }; - if r.reg_num() == 0 { - let r = match lvl { - Level::Shallow => { - let k = self.arg_c; - - if let GenContext::Last(chunk_num) = term_loc { - self.evacuate_arg(chunk_num, target); - } - - self.arg_c += 1; - RegType::Temp(k) - }, - _ => RegType::Temp(self.alloc_reg_to_non_var()) - }; - - cell.set(r); - } + cell.set(r); } fn mark_var(&mut self, var: Rc, lvl: Level, cell: &'a Cell, diff --git a/src/prolog/lib/dcgs.pl b/src/prolog/lib/dcgs.pl index f2640a28..7bad6997 100644 --- a/src/prolog/lib/dcgs.pl +++ b/src/prolog/lib/dcgs.pl @@ -25,7 +25,7 @@ term_expansion(Term0, (ModHead :- ModBody)) :- !, nonvar(Head), Head =.. [RuleName | Args], - append(Args, ['$VAR'(0), '$VAR'(N)], ModArgs), + append(Args, ['$VAR'(0), '$VAR'(N)], ModArgs), %% problematic line. ModHead =.. [RuleName | ModArgs], nonvar(Body), expand_body(Body, ModBody1, 0, N1), diff --git a/src/prolog/machine/mod.rs b/src/prolog/machine/mod.rs index b4c21f11..0370a58b 100644 --- a/src/prolog/machine/mod.rs +++ b/src/prolog/machine/mod.rs @@ -317,7 +317,7 @@ impl Machine { continue; } - + self.indices.code_dir.insert(key.clone(), idx.clone()); } @@ -347,9 +347,9 @@ impl Machine { self.machine_st.copy_and_align_ball_to_heap(); let error_str = self.machine_st.print_exception(Addr::HeapCell(h), - &heap_locs, - TermFormatter {}, - PrinterOutputter::new()) + &heap_locs, + TermFormatter {}, + PrinterOutputter::new()) .result(); EvalSession::from(SessionError::QueryFailureWithException(error_str))