From adf96293335d1120bbf57f39c01f79f4190ff172 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Sat, 9 Mar 2019 00:37:58 -0700 Subject: [PATCH] stop module dynamic predicate modifications from taking on the user module index. --- src/prolog/machine/compile.rs | 25 +++++++++---------------- src/prolog/machine/dynamic_database.rs | 4 ++-- src/prolog/machine/mod.rs | 2 +- src/prolog/machine/modules.rs | 4 ++-- 4 files changed, 14 insertions(+), 21 deletions(-) diff --git a/src/prolog/machine/compile.rs b/src/prolog/machine/compile.rs index 7b0851f1..55dfd691 100644 --- a/src/prolog/machine/compile.rs +++ b/src/prolog/machine/compile.rs @@ -159,8 +159,7 @@ pub fn compile_term(wam: &mut Machine, packet: TopLevelPacket) -> EvalSession } pub(super) -fn compile_into_module(wam: &mut Machine, module_name: ClauseName, src: R, - name: ClauseName, arity: usize) +fn compile_into_module(wam: &mut Machine, module_name: ClauseName, src: R, name: ClauseName) -> EvalSession { let mut indices = default_index_store!(wam.atom_tbl_of(&name)); @@ -178,21 +177,15 @@ fn compile_into_module(wam: &mut Machine, module_name: ClauseName, src: match wam.indices.modules.get_mut(&module_name) { Some(module) => { - let code_dir = mem::replace(&mut indices.code_dir, CodeDir::new()); - module.code_dir.extend(code_dir); - - if module.module_decl.exports.contains(&(name.clone(), arity)) { - if let Some(idx) = wam.indices.code_dir.get(&(name.clone(), arity)) { - if module.module_decl.name == module_name { - if module_code.len() > 0 { - set_code_index!(idx, IndexPtr::Index(wam.code_repo.code.len()), - module_name.clone()); - } else { - set_code_index!(idx, IndexPtr::Undefined, module_name.clone()); - } - } - } + let mut code_dir = mem::replace(&mut indices.code_dir, CodeDir::new()); + + // replace the "user" module src's in the indices with module_name. + for (_, idx) in code_dir.iter_mut() { + let p = idx.0.borrow().0; + set_code_index!(idx, p, module_name.clone()); } + + module.code_dir.extend(code_dir); }, _ => unreachable!() }; diff --git a/src/prolog/machine/dynamic_database.rs b/src/prolog/machine/dynamic_database.rs index 94aec567..169613b4 100644 --- a/src/prolog/machine/dynamic_database.rs +++ b/src/prolog/machine/dynamic_database.rs @@ -26,12 +26,12 @@ impl Machine { match module.as_str() { "user" => compile_user_module(self, src), - _ => compile_into_module(self, module, src, name, arity) + _ => compile_into_module(self, module, src, name) } }, None => compile_user_module(self, src) }, - _ => compile_into_module(self, name.owning_module(), src, name, arity) + _ => compile_into_module(self, name.owning_module(), src, name) } } diff --git a/src/prolog/machine/mod.rs b/src/prolog/machine/mod.rs index a88c7f8d..3b57e7af 100644 --- a/src/prolog/machine/mod.rs +++ b/src/prolog/machine/mod.rs @@ -113,7 +113,7 @@ impl SubModuleUser for IndexStore { println!("warning: overwriting {}/{}", &name, arity); } - let (p, module_name) = idx.0.borrow().clone(); + let (p, module_name) = idx.0.borrow().clone(); set_code_index!(code_idx, p, module_name); return; } diff --git a/src/prolog/machine/modules.rs b/src/prolog/machine/modules.rs index ebdc4c24..aa040ba2 100644 --- a/src/prolog/machine/modules.rs +++ b/src/prolog/machine/modules.rs @@ -121,7 +121,7 @@ pub trait SubModuleUser if let Some(code_data) = submodule.code_dir.get(&(name.clone(), arity)) { let name = name.with_table(submodule.atom_tbl.clone()); let mut atom_tbl = self.atom_tbl(); - + atom_tbl.borrow_mut().insert(name.to_rc()); self.insert_dir_entry(name, arity, code_data.clone()); @@ -176,7 +176,7 @@ impl SubModuleUser for Module { } fn get_code_index(&self, key: PredicateKey, _: ClauseName) -> Option { - self.code_dir.get(&key).cloned().map(CodeIndex::from) + self.code_dir.get(&key).cloned() } fn remove_code_index(&mut self, key: PredicateKey) { -- 2.54.0