From: Mark Date: Mon, 18 Dec 2023 20:26:36 +0000 (-0700) Subject: fix retraction of local dynamic predicates (#2215, #2232) X-Git-Tag: v0.9.4~68 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=f30cee7655e4f6fce6fdce20a3f106d5a03764fe;p=scryer-prolog.git fix retraction of local dynamic predicates (#2215, #2232) --- diff --git a/src/machine/compile.rs b/src/machine/compile.rs index fbfaebee..048631ae 100644 --- a/src/machine/compile.rs +++ b/src/machine/compile.rs @@ -1316,7 +1316,8 @@ impl<'a, LS: LoadState<'a>> Loader<'a, LS> { .clause_clause_locs .extend(&clause_clause_locs.make_contiguous()[0..]); - let skeleton = cg.skeleton; + let mut skeleton = cg.skeleton; + skeleton.core.is_dynamic = settings.is_dynamic(); self.add_extensible_predicate(key, skeleton, predicates.compilation_target); } @@ -2138,7 +2139,7 @@ impl<'a, LS: LoadState<'a>> Loader<'a, LS> { .map(|skeleton| skeleton.predicate_info()) .unwrap_or_default(); - let mut predicate_info = self + let predicate_info = self .wam_prelude .indices .get_predicate_skeleton(&self.payload.predicates.compilation_target, &key) @@ -2200,8 +2201,6 @@ impl<'a, LS: LoadState<'a>> Loader<'a, LS> { (0..skeleton.clauses.len()).map(Some).collect(), false, // the builtin M:'$clause'/2 is never dynamic. ); - - predicate_info.is_dynamic = false; } self.payload diff --git a/src/machine/load_state.rs b/src/machine/load_state.rs index 3cdc10aa..079ee29e 100644 --- a/src/machine/load_state.rs +++ b/src/machine/load_state.rs @@ -466,13 +466,39 @@ impl<'a, LS: LoadState<'a>> Loader<'a, LS> { None => return, }; + let mut skipped_local_predicates = IndexSet::with_hasher(FxBuildHasher::default()); + + for ((local_compilation_target, key), skeleton) in + removed_module.local_extensible_predicates.iter() + { + skipped_local_predicates.insert(key); + + if skeleton.is_multifile { + continue; + } + + if let Some(code_index) = removed_module.code_dir.get_mut(key) { + if let Some(global_skeleton) = self + .wam_prelude + .indices + .get_predicate_skeleton(local_compilation_target, key) + { + let old_index_ptr = code_index.replace(if global_skeleton.core.is_dynamic { + IndexPtr::dynamic_undefined() + } else { + IndexPtr::undefined() + }); + + self.payload.retraction_info.push_record( + RetractionRecord::ReplacedModulePredicate(module_name, *key, old_index_ptr), + ); + } + } + } + for (key, code_index) in removed_module.code_dir.iter_mut() { - match removed_module - .local_extensible_predicates - .get(&(CompilationTarget::User, *key)) - { - Some(skeleton) if skeleton.is_multifile => continue, - _ => {} + if skipped_local_predicates.contains(&key) { + continue; } let old_index_ptr = code_index.replace(IndexPtr::undefined());