evacuate when allocating anon vars
This commit is contained in:
@@ -11,7 +11,7 @@ pub trait Allocator<'a>
|
|||||||
{
|
{
|
||||||
fn new() -> Self;
|
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>;
|
where Target: CompilationTarget<'a>;
|
||||||
fn mark_non_var<Target>(&mut self, Level, GenContext, &'a Cell<RegType>, &mut Vec<Target>)
|
fn mark_non_var<Target>(&mut self, Level, GenContext, &'a Cell<RegType>, &mut Vec<Target>)
|
||||||
where Target: CompilationTarget<'a>;
|
where Target: CompilationTarget<'a>;
|
||||||
|
|||||||
@@ -158,7 +158,7 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<TermMarker>
|
|||||||
{
|
{
|
||||||
match subterm {
|
match subterm {
|
||||||
&Term::AnonVar if is_exposed =>
|
&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 =>
|
&Term::AnonVar =>
|
||||||
Self::add_or_increment_void_instr(target),
|
Self::add_or_increment_void_instr(target),
|
||||||
&Term::Cons(ref cell, _, _) | &Term::Clause(ref cell, _, _, _) => {
|
&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 {
|
if let GenContext::Head = term_loc {
|
||||||
self.marker.advance_arg();
|
self.marker.advance_arg();
|
||||||
} else {
|
} 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() == "!" => {
|
TermRef::Var(lvl @ Level::Shallow, cell, ref var) if var.as_str() == "!" => {
|
||||||
if self.marker.is_unbound(var.clone()) {
|
if self.marker.is_unbound(var.clone()) {
|
||||||
|
|||||||
@@ -257,7 +257,7 @@ impl ListingCompiler {
|
|||||||
|
|
||||||
let idx = code_dir.entry((name.clone(), arity)).or_insert(CodeIndex::default());
|
let idx = code_dir.entry((name.clone(), 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());
|
||||||
|
|
||||||
code.extend(decl_code.into_iter());
|
code.extend(decl_code.into_iter());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
where Target: CompilationTarget<'a>
|
||||||
{
|
{
|
||||||
let r = RegType::Temp(self.alloc_reg_to_non_var());
|
let r = RegType::Temp(self.alloc_reg_to_non_var());
|
||||||
@@ -220,8 +220,13 @@ impl<'a> Allocator<'a> for DebrayAllocator
|
|||||||
Level::Deep => target.push(Target::subterm_to_variable(r)),
|
Level::Deep => target.push(Target::subterm_to_variable(r)),
|
||||||
Level::Root | Level::Shallow => {
|
Level::Root | Level::Shallow => {
|
||||||
let k = self.arg_c;
|
let k = self.arg_c;
|
||||||
self.arg_c += 1;
|
|
||||||
|
|
||||||
|
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));
|
target.push(Target::argument_to_variable(r, k));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ diag_ints(M, N, M0, N0) :-
|
|||||||
diag_nats_signs(M, N, M0, N0).
|
diag_nats_signs(M, N, M0, N0).
|
||||||
|
|
||||||
diag_ints(M, N) :-
|
diag_ints(M, N) :-
|
||||||
diag_ints(M0, N0, M, N).
|
diag_ints(_, _, M, N).
|
||||||
|
|
||||||
gen_ints(L, U) :-
|
gen_ints(L, U) :-
|
||||||
can_be(integer, L), can_be(integer, U),
|
can_be(integer, L), can_be(integer, U),
|
||||||
|
|||||||
@@ -343,7 +343,7 @@ impl Machine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn compile_libraries(&mut self) {
|
fn compile_libraries(&mut self) {
|
||||||
compile_user_module(self, LISTS.as_bytes());
|
compile_user_module(self, LISTS.as_bytes());
|
||||||
compile_user_module(self, QUEUES.as_bytes());
|
compile_user_module(self, QUEUES.as_bytes());
|
||||||
compile_user_module(self, ERROR.as_bytes());
|
compile_user_module(self, ERROR.as_bytes());
|
||||||
compile_user_module(self, BETWEEN.as_bytes());
|
compile_user_module(self, BETWEEN.as_bytes());
|
||||||
@@ -506,7 +506,7 @@ impl Machine {
|
|||||||
for (var, addr) in sorted_vars {
|
for (var, addr) in sorted_vars {
|
||||||
output = self.machine_st.print_var_eq(var.clone(), addr.clone(), var_dir, output);
|
output = self.machine_st.print_var_eq(var.clone(), addr.clone(), var_dir, output);
|
||||||
}
|
}
|
||||||
|
|
||||||
output
|
output
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -608,7 +608,7 @@ impl MachineState {
|
|||||||
_ => {}
|
_ => {}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn record_var_places(&self, chunk_num: usize, alloc_locs: &AllocVarDict,
|
fn record_var_places(&self, chunk_num: usize, alloc_locs: &AllocVarDict,
|
||||||
heap_locs: &mut HeapVarDict)
|
heap_locs: &mut HeapVarDict)
|
||||||
|
|||||||
Reference in New Issue
Block a user