remove intra-module predicates from module code directory when module is being re-defined (#848)
This commit is contained in:
@@ -56,8 +56,8 @@
|
|||||||
%% table(PIList) :-
|
%% table(PIList) :-
|
||||||
%% throw(error(context_error(nodirective, table(PIList)), _)).
|
%% throw(error(context_error(nodirective, table(PIList)), _)).
|
||||||
|
|
||||||
instantiation_error(Var) :-
|
%% instantiation_error(Var) :-
|
||||||
throw(error(instantiation_error(Var), _)).
|
%% throw(error(instantiation_error(Var), _)).
|
||||||
|
|
||||||
wrappers(Var) -->
|
wrappers(Var) -->
|
||||||
{ var(Var), !,
|
{ var(Var), !,
|
||||||
|
|||||||
@@ -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) {
|
pub(super) fn remove_module_exports(&mut self, module_name: ClauseName) {
|
||||||
let removed_module = match self.wam.indices.modules.remove(&module_name) {
|
let removed_module = match self.wam.indices.modules.remove(&module_name) {
|
||||||
Some(module) => module,
|
Some(module) => module,
|
||||||
@@ -884,7 +905,9 @@ impl<'a> LoadState<'a> {
|
|||||||
|
|
||||||
pub(crate) fn add_module(&mut self, module_decl: ModuleDecl, listing_src: ListingSource) {
|
pub(crate) fn add_module(&mut self, module_decl: ModuleDecl, listing_src: ListingSource) {
|
||||||
let module_name = module_decl.name.clone();
|
let module_name = module_decl.name.clone();
|
||||||
|
|
||||||
self.remove_module_exports(module_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) {
|
match self.wam.indices.modules.get_mut(&module_name) {
|
||||||
Some(module) => {
|
Some(module) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user