From: Mark Thom Date: Sat, 14 Jan 2023 01:34:29 +0000 (-0700) Subject: restore free list usage on structures in facts without crashing lgtunit loader X-Git-Tag: v0.9.2~235 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=f9e3bdb6b0bed0aa2eed38cde57cae96c8501afb;p=scryer-prolog.git restore free list usage on structures in facts without crashing lgtunit loader --- 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 {