From 5f8bdc564b7319c692a7923ed60661d4f7b9d1a6 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Mon, 22 Feb 2021 02:00:25 -0700 Subject: [PATCH] extend existing local predicate skeletons in LoadState::compile --- src/machine/compile.rs | 39 ++++++++++++++++++++++++++++++++------- src/machine/loader.rs | 22 ++++++++++++++++++++++ 2 files changed, 54 insertions(+), 7 deletions(-) diff --git a/src/machine/compile.rs b/src/machine/compile.rs index 9364d176..ebdcb134 100644 --- a/src/machine/compile.rs +++ b/src/machine/compile.rs @@ -1099,14 +1099,39 @@ impl<'a> LoadState<'a> { } } - let mut skeleton = PredicateSkeleton::new(); - skeleton.clause_clause_locs = clause_clause_locs; + match self + .wam + .indices + .get_local_predicate_skeleton_mut( + &self.compilation_target, + predicates.compilation_target.clone(), + key.clone(), + ) + { + Some(skeleton) => { + self.retraction_info + .push_record(RetractionRecord::SkeletonLocalClauseTruncateBack( + self.compilation_target.clone(), + predicates.compilation_target.clone(), + key.clone(), + skeleton.clause_clause_locs.len(), + )); - self.add_local_extensible_predicate( - predicates.compilation_target.clone(), - key.clone(), - skeleton, - ); + skeleton.clause_clause_locs.extend_from_slice( + &clause_clause_locs[0 ..] + ); + } + None => { + let mut skeleton = PredicateSkeleton::new(); + skeleton.clause_clause_locs = clause_clause_locs; + + self.add_local_extensible_predicate( + predicates.compilation_target.clone(), + key.clone(), + skeleton, + ); + } + } } set_code_index( diff --git a/src/machine/loader.rs b/src/machine/loader.rs index afa193d3..a9d45bcc 100644 --- a/src/machine/loader.rs +++ b/src/machine/loader.rs @@ -76,6 +76,7 @@ pub(crate) enum RetractionRecord { SkeletonClausePopFront(CompilationTarget, PredicateKey), SkeletonLocalClauseClausePopBack(CompilationTarget, CompilationTarget, PredicateKey), SkeletonLocalClauseClausePopFront(CompilationTarget, CompilationTarget, PredicateKey), + SkeletonLocalClauseTruncateBack(CompilationTarget, CompilationTarget, PredicateKey, usize), SkeletonClauseTruncateBack(CompilationTarget, PredicateKey, usize), SkeletonClauseStartReplaced(CompilationTarget, PredicateKey, usize, usize), RemovedSkeletonClause( @@ -519,6 +520,27 @@ impl<'a> Drop for LoadState<'a> { None => {} } } + RetractionRecord::SkeletonLocalClauseTruncateBack( + src_compilation_target, + local_compilation_target, + key, + len, + ) => { + match self + .wam + .indices + .get_local_predicate_skeleton_mut( + &src_compilation_target, + local_compilation_target, + key, + ) + { + Some(skeleton) => { + skeleton.clause_clause_locs.truncate_back(len); + } + None => {} + } + } RetractionRecord::SkeletonClauseTruncateBack(compilation_target, key, len) => { match self .wam -- 2.54.0