fix bug with mark_non_var

This commit is contained in:
Mark Thom
2018-10-08 00:34:08 -06:00
parent fa1bb6df3a
commit 398d91576c
5 changed files with 25 additions and 26 deletions

View File

@@ -35,7 +35,7 @@ Extend rusty-wam to include the following, among other features:
- A representation of 'partial strings' as difference lists - A representation of 'partial strings' as difference lists
of characters (_done_). of characters (_done_).
* `term_expansion/2` and `goal_expansion/2` (_in progress_). * `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 * Attributed variables using the SICStus Prolog interface and
semantics. Adding coroutines like `dif/2`, `freeze/2`, etc. semantics. Adding coroutines like `dif/2`, `freeze/2`, etc.
is straightforward with attributed variables. is straightforward with attributed variables.

View File

@@ -220,7 +220,7 @@ impl ListingCompiler {
wam.machine_flags())?; wam.machine_flags())?;
compile_appendix(&mut decl_code, &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()); let idx = code_dir.entry((name, arity)).or_insert(CodeIndex::default());
set_code_index!(idx, IndexPtr::Index(p), self.get_module_name()); 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)?; let mut code = cg.compile_predicate(&(preds.0).0)?;
compile_appendix(&mut code, &preds.1, false, flags)?; compile_appendix(&mut code, &preds.1, false, flags)?;
Ok(code_repo.term_expanders = code) Ok(code_repo.term_expanders = code)
}, },
Declaration::NonCountedBacktracking(name, arity) => Declaration::NonCountedBacktracking(name, arity) =>
@@ -351,7 +351,7 @@ fn compile_listing<R: Read>(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, module_code, indices));
try_eval_session!(compiler.add_code(wam, toplvl_code, results.toplevel_indices)); try_eval_session!(compiler.add_code(wam, toplvl_code, results.toplevel_indices));
EvalSession::EntrySuccess EvalSession::EntrySuccess
} }

View File

@@ -231,24 +231,23 @@ impl<'a> Allocator<'a> for DebrayAllocator
where Target: CompilationTarget<'a> where Target: CompilationTarget<'a>
{ {
let r = cell.get(); 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 { cell.set(r);
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);
}
} }
fn mark_var<Target>(&mut self, var: Rc<Var>, lvl: Level, cell: &'a Cell<VarReg>, fn mark_var<Target>(&mut self, var: Rc<Var>, lvl: Level, cell: &'a Cell<VarReg>,

View File

@@ -25,7 +25,7 @@ term_expansion(Term0, (ModHead :- ModBody)) :-
!, !,
nonvar(Head), nonvar(Head),
Head =.. [RuleName | Args], Head =.. [RuleName | Args],
append(Args, ['$VAR'(0), '$VAR'(N)], ModArgs), append(Args, ['$VAR'(0), '$VAR'(N)], ModArgs), %% problematic line.
ModHead =.. [RuleName | ModArgs], ModHead =.. [RuleName | ModArgs],
nonvar(Body), nonvar(Body),
expand_body(Body, ModBody1, 0, N1), expand_body(Body, ModBody1, 0, N1),

View File

@@ -317,7 +317,7 @@ impl Machine {
continue; continue;
} }
self.indices.code_dir.insert(key.clone(), idx.clone()); self.indices.code_dir.insert(key.clone(), idx.clone());
} }
@@ -347,9 +347,9 @@ impl Machine {
self.machine_st.copy_and_align_ball_to_heap(); self.machine_st.copy_and_align_ball_to_heap();
let error_str = self.machine_st.print_exception(Addr::HeapCell(h), let error_str = self.machine_st.print_exception(Addr::HeapCell(h),
&heap_locs, &heap_locs,
TermFormatter {}, TermFormatter {},
PrinterOutputter::new()) PrinterOutputter::new())
.result(); .result();
EvalSession::from(SessionError::QueryFailureWithException(error_str)) EvalSession::from(SessionError::QueryFailureWithException(error_str))