From dc89ed57f216549a20b5cb5134c51a0a65517254 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Sun, 24 Feb 2019 13:40:58 -0700 Subject: [PATCH] evacuate when allocating anon vars --- src/prolog/allocator.rs | 2 +- src/prolog/codegen.rs | 4 ++-- src/prolog/compile.rs | 2 +- src/prolog/debray_allocator.rs | 9 +++++++-- src/prolog/lib/between.pl | 2 +- src/prolog/machine/mod.rs | 6 +++--- 6 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/prolog/allocator.rs b/src/prolog/allocator.rs index a6c74dd5..a498fbaf 100644 --- a/src/prolog/allocator.rs +++ b/src/prolog/allocator.rs @@ -11,7 +11,7 @@ pub trait Allocator<'a> { fn new() -> Self; - fn mark_anon_var(&mut self, Level, &mut Vec) + fn mark_anon_var(&mut self, Level, GenContext, &mut Vec) where Target: CompilationTarget<'a>; fn mark_non_var(&mut self, Level, GenContext, &'a Cell, &mut Vec) where Target: CompilationTarget<'a>; diff --git a/src/prolog/codegen.rs b/src/prolog/codegen.rs index 80ae6824..ca4a81ac 100644 --- a/src/prolog/codegen.rs +++ b/src/prolog/codegen.rs @@ -158,7 +158,7 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator { 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 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()) { diff --git a/src/prolog/compile.rs b/src/prolog/compile.rs index 041ee425..f318bb39 100644 --- a/src/prolog/compile.rs +++ b/src/prolog/compile.rs @@ -257,7 +257,7 @@ impl ListingCompiler { let idx = code_dir.entry((name.clone(), arity)).or_insert(CodeIndex::default()); set_code_index!(idx, IndexPtr::Index(p), self.get_module_name()); - + code.extend(decl_code.into_iter()); } diff --git a/src/prolog/debray_allocator.rs b/src/prolog/debray_allocator.rs index adfefc73..86053c48 100644 --- a/src/prolog/debray_allocator.rs +++ b/src/prolog/debray_allocator.rs @@ -211,7 +211,7 @@ impl<'a> Allocator<'a> for DebrayAllocator } } - fn mark_anon_var(&mut self, lvl: Level, target: &mut Vec) + fn mark_anon_var(&mut self, lvl: Level, term_loc: GenContext, target: &mut Vec) where Target: CompilationTarget<'a> { 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::Root | Level::Shallow => { 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)); } }; diff --git a/src/prolog/lib/between.pl b/src/prolog/lib/between.pl index b54a4f04..78aaf26f 100644 --- a/src/prolog/lib/between.pl +++ b/src/prolog/lib/between.pl @@ -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), diff --git a/src/prolog/machine/mod.rs b/src/prolog/machine/mod.rs index c2567c4e..b7446415 100644 --- a/src/prolog/machine/mod.rs +++ b/src/prolog/machine/mod.rs @@ -343,7 +343,7 @@ impl Machine { } 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, ERROR.as_bytes()); compile_user_module(self, BETWEEN.as_bytes()); @@ -506,7 +506,7 @@ impl Machine { for (var, addr) in sorted_vars { output = self.machine_st.print_var_eq(var.clone(), addr.clone(), var_dir, output); } - + output } @@ -608,7 +608,7 @@ impl MachineState { _ => {} }; } - } + } fn record_var_places(&self, chunk_num: usize, alloc_locs: &AllocVarDict, heap_locs: &mut HeapVarDict) -- 2.54.0