From 7ea7e5c9519c70954d8bf722ee2a1b828c725917 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Sat, 13 Mar 2021 23:22:24 -0700 Subject: [PATCH] remove intra-module predicates from module code directory when module is being re-defined (#848) --- src/lib/tabling/wrapper.pl | 4 ++-- src/machine/load_state.rs | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/lib/tabling/wrapper.pl b/src/lib/tabling/wrapper.pl index 7925a667..4aad452a 100644 --- a/src/lib/tabling/wrapper.pl +++ b/src/lib/tabling/wrapper.pl @@ -56,8 +56,8 @@ %% table(PIList) :- %% throw(error(context_error(nodirective, table(PIList)), _)). -instantiation_error(Var) :- - throw(error(instantiation_error(Var), _)). +%% instantiation_error(Var) :- +%% throw(error(instantiation_error(Var), _)). wrappers(Var) --> { var(Var), !, diff --git a/src/machine/load_state.rs b/src/machine/load_state.rs index 96f88d04..4e9d2033 100644 --- a/src/machine/load_state.rs +++ b/src/machine/load_state.rs @@ -473,6 +473,27 @@ impl<'a> LoadState<'a> { } } + pub(super) fn remove_replaced_module(&mut self, module_name: ClauseName) { + let removed_module = match self.wam.indices.modules.remove(&module_name) { + Some(module) => module, + None => return, + }; + + for (key, code_index) in &removed_module.code_dir { + if code_index.get() != IndexPtr::Undefined { + let old_index_ptr = code_index.replace(IndexPtr::Undefined); + + self.retraction_info.push_record( + RetractionRecord::ReplacedModulePredicate( + module_name.clone(), key.clone(), old_index_ptr, + ), + ); + } + } + + self.wam.indices.modules.insert(module_name, removed_module); + } + pub(super) fn remove_module_exports(&mut self, module_name: ClauseName) { let removed_module = match self.wam.indices.modules.remove(&module_name) { Some(module) => module, @@ -884,7 +905,9 @@ impl<'a> LoadState<'a> { pub(crate) fn add_module(&mut self, module_decl: ModuleDecl, listing_src: ListingSource) { let module_name = module_decl.name.clone(); + self.remove_module_exports(module_name.clone()); + self.remove_replaced_module(module_name.clone()); match self.wam.indices.modules.get_mut(&module_name) { Some(module) => { -- 2.54.0