evacuate when allocating anon vars

This commit is contained in:
Mark Thom
2019-02-24 13:40:58 -07:00
parent 8f9c620a89
commit dc89ed57f2
6 changed files with 15 additions and 10 deletions

View File

@@ -11,7 +11,7 @@ pub trait Allocator<'a>
{
fn new() -> Self;
fn mark_anon_var<Target>(&mut self, Level, &mut Vec<Target>)
fn mark_anon_var<Target>(&mut self, Level, GenContext, &mut Vec<Target>)
where Target: CompilationTarget<'a>;
fn mark_non_var<Target>(&mut self, Level, GenContext, &'a Cell<RegType>, &mut Vec<Target>)
where Target: CompilationTarget<'a>;

View File

@@ -158,7 +158,7 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<TermMarker>
{
match subterm {
&Term::AnonVar if is_exposed =>
self.marker.mark_anon_var(Level::Deep, target),
self.marker.mark_anon_var(Level::Deep, term_loc, target),
&Term::AnonVar =>
Self::add_or_increment_void_instr(target),
&Term::Cons(ref cell, _, _) | &Term::Clause(ref cell, _, _, _) => {
@@ -207,7 +207,7 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<TermMarker>
if let GenContext::Head = term_loc {
self.marker.advance_arg();
} else {
self.marker.mark_anon_var(lvl, &mut target);
self.marker.mark_anon_var(lvl, term_loc, &mut target);
},
TermRef::Var(lvl @ Level::Shallow, cell, ref var) if var.as_str() == "!" => {
if self.marker.is_unbound(var.clone()) {

View File

@@ -211,7 +211,7 @@ impl<'a> Allocator<'a> for DebrayAllocator
}
}
fn mark_anon_var<Target>(&mut self, lvl: Level, target: &mut Vec<Target>)
fn mark_anon_var<Target>(&mut self, lvl: Level, term_loc: GenContext, target: &mut Vec<Target>)
where Target: CompilationTarget<'a>
{
let r = RegType::Temp(self.alloc_reg_to_non_var());
@@ -220,6 +220,11 @@ impl<'a> Allocator<'a> for DebrayAllocator
Level::Deep => target.push(Target::subterm_to_variable(r)),
Level::Root | 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;
target.push(Target::argument_to_variable(r, k));

View File

@@ -84,7 +84,7 @@ diag_ints(M, N, M0, N0) :-
diag_nats_signs(M, N, M0, N0).
diag_ints(M, N) :-
diag_ints(M0, N0, M, N).
diag_ints(_, _, M, N).
gen_ints(L, U) :-
can_be(integer, L), can_be(integer, U),