]> Repositorios git - scryer-prolog.git/commitdiff
remove intra-module predicates from module code directory when module is being re...
authorMark Thom <[email protected]>
Sun, 14 Mar 2021 06:22:24 +0000 (23:22 -0700)
committerMark Thom <[email protected]>
Sun, 14 Mar 2021 06:22:24 +0000 (23:22 -0700)
src/lib/tabling/wrapper.pl
src/machine/load_state.rs

index 7925a667b252253bb404a08f1f6f84c14b41aecc..4aad452a9de29b5f40de4347c7d51f7f5e45b7d5 100644 (file)
@@ -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), !,
index 96f88d044f02fe60c12f4641974b414bc58a1ce6..4e9d20337bffb0647d7d6e686e25676c266b3034 100644 (file)
@@ -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) => {