From f9e3bdb6b0bed0aa2eed38cde57cae96c8501afb Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Fri, 13 Jan 2023 18:34:29 -0700 Subject: [PATCH] restore free list usage on structures in facts without crashing lgtunit loader --- src/codegen.rs | 14 ++++++++++++++ src/debray_allocator.rs | 4 ++++ 2 files changed, 18 insertions(+) diff --git a/src/codegen.rs b/src/codegen.rs index 79574005..31219e1a 100644 --- a/src/codegen.rs +++ b/src/codegen.rs @@ -243,14 +243,22 @@ fn trim_structure_by_last_arg(instr: &mut Instruction, last_arg: &Term) { } trait AddToFreeList<'a, Target: CompilationTarget<'a>> { + fn add_term_to_free_list(&mut self, r: RegType); fn add_subterm_to_free_list(&mut self, term: &Term); } impl<'a, 'b> AddToFreeList<'a, FactInstruction> for CodeGenerator<'b> { + fn add_term_to_free_list(&mut self, r: RegType) { + self.marker.add_to_free_list(r); + } + fn add_subterm_to_free_list(&mut self, _term: &Term) {} } impl<'a, 'b> AddToFreeList<'a, QueryInstruction> for CodeGenerator<'b> { + #[inline(always)] + fn add_term_to_free_list(&mut self, _r: RegType) {} + #[inline(always)] fn add_subterm_to_free_list(&mut self, term: &Term) { if let Some(cell) = structure_cell(term) { @@ -374,6 +382,8 @@ impl<'b> CodeGenerator<'b> { self.marker.mark_non_var::(lvl, term_loc, cell, &mut target); target.push(Target::to_structure(name, terms.len(), cell.get())); + as AddToFreeList<'a, Target>>::add_term_to_free_list(self, cell.get()); + if let Some(instr) = target.last_mut() { if let Some(term) = terms.last() { trim_structure_by_last_arg(instr, term); @@ -392,6 +402,8 @@ impl<'b> CodeGenerator<'b> { self.marker.mark_non_var::(lvl, term_loc, cell, &mut target); target.push(Target::to_list(lvl, cell.get())); + as AddToFreeList<'a, Target>>::add_term_to_free_list(self, cell.get()); + self.subterm_to_instr::(head, term_loc, &mut target); self.subterm_to_instr::(tail, term_loc, &mut target); @@ -965,6 +977,8 @@ impl<'b> CodeGenerator<'b> { return Err(CompilationError::ExceededMaxArity); } + self.marker.reset_free_list(); + let mut unsafe_var_marker = UnsafeVarMarker::new(); if !fact.is_empty() { diff --git a/src/debray_allocator.rs b/src/debray_allocator.rs index 51ac8f70..e9cc73c7 100644 --- a/src/debray_allocator.rs +++ b/src/debray_allocator.rs @@ -218,6 +218,10 @@ impl DebrayAllocator { self.free_list.push(r); } } + + pub fn reset_free_list(&mut self) { + self.free_list.clear(); + } } impl Allocator for DebrayAllocator { -- 2.54.0