From: Mark Date: Tue, 28 Nov 2023 19:58:54 +0000 (-0700) Subject: allocate cut variables as temporaries when in non-allocating clause (#2183) X-Git-Tag: v0.9.4~99 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=de5de0cfaf68a5dd296f240d1568b96dbdf53a02;p=scryer-prolog.git allocate cut variables as temporaries when in non-allocating clause (#2183) --- diff --git a/src/allocator.rs b/src/allocator.rs index e45c36b6..c2300f90 100644 --- a/src/allocator.rs +++ b/src/allocator.rs @@ -29,20 +29,25 @@ pub(crate) trait Allocator { &mut self, var_num: usize, lvl: Level, - cell: &'a Cell, + cell: &Cell, term_loc: GenContext, code: &mut CodeDeque, r: RegType, is_new_var: bool, ); - fn mark_cut_var(&mut self, var_num: usize, chunk_num: usize) -> RegType; + fn mark_cut_var<'a, Target: CompilationTarget<'a>>( + &mut self, + var_num: usize, + term_loc: GenContext, + code: &mut CodeDeque, + ) -> RegType; fn mark_var<'a, Target: CompilationTarget<'a>>( &mut self, var_num: usize, lvl: Level, - cell: &'a Cell, + cell: &Cell, context: GenContext, code: &mut CodeDeque, ); diff --git a/src/codegen.rs b/src/codegen.rs index 09722fbd..993a122e 100644 --- a/src/codegen.rs +++ b/src/codegen.rs @@ -926,12 +926,16 @@ impl<'b> CodeGenerator<'b> { match term { &QueryTerm::GetLevel(var_num) => { let code = branch_code_stack.code(code); - let r = self.marker.mark_cut_var(var_num, chunk_num); + let r = self + .marker + .mark_cut_var::(var_num, term_loc, code); code.push_back(instr!("get_level", r)); } &QueryTerm::GetCutPoint { var_num, prev_b } => { let code = branch_code_stack.code(code); - let r = self.marker.mark_cut_var(var_num, chunk_num); + let r = self + .marker + .mark_cut_var::(var_num, term_loc, code); code.push_back(if prev_b { instr!("get_prev_level", r) diff --git a/src/debray_allocator.rs b/src/debray_allocator.rs index 593e584a..7154cea7 100644 --- a/src/debray_allocator.rs +++ b/src/debray_allocator.rs @@ -736,7 +736,7 @@ impl Allocator for DebrayAllocator { &mut self, var_num: usize, lvl: Level, - cell: &'a Cell, + cell: &Cell, term_loc: GenContext, code: &mut CodeDeque, ) { @@ -776,7 +776,7 @@ impl Allocator for DebrayAllocator { &mut self, var_num: usize, lvl: Level, - cell: &'a Cell, + cell: &Cell, term_loc: GenContext, code: &mut CodeDeque, r: RegType, @@ -840,10 +840,18 @@ impl Allocator for DebrayAllocator { self.in_use.insert(o); } - fn mark_cut_var(&mut self, var_num: usize, chunk_num: usize) -> RegType { + fn mark_cut_var<'a, Target: CompilationTarget<'a>>( + &mut self, + var_num: usize, + term_loc: GenContext, + code: &mut CodeDeque, + ) -> RegType { match self.get_binding(var_num) { - RegType::Perm(0) | RegType::Temp(0) => { - RegType::Perm(self.alloc_perm_var(var_num, chunk_num)) + RegType::Perm(0) => RegType::Perm(self.alloc_perm_var(var_num, term_loc.chunk_num())), + RegType::Temp(0) => { + let cell = Cell::default(); + self.mark_var::(var_num, Level::Shallow, &cell, term_loc, code); + cell.get().norm() } r => r, }