stop module dynamic predicate modifications from taking on the user module index.
This commit is contained in:
@@ -159,8 +159,7 @@ pub fn compile_term(wam: &mut Machine, packet: TopLevelPacket) -> EvalSession
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(super)
|
pub(super)
|
||||||
fn compile_into_module<R: Read>(wam: &mut Machine, module_name: ClauseName, src: R,
|
fn compile_into_module<R: Read>(wam: &mut Machine, module_name: ClauseName, src: R, name: ClauseName)
|
||||||
name: ClauseName, arity: usize)
|
|
||||||
-> EvalSession
|
-> EvalSession
|
||||||
{
|
{
|
||||||
let mut indices = default_index_store!(wam.atom_tbl_of(&name));
|
let mut indices = default_index_store!(wam.atom_tbl_of(&name));
|
||||||
@@ -178,21 +177,15 @@ fn compile_into_module<R: Read>(wam: &mut Machine, module_name: ClauseName, src:
|
|||||||
|
|
||||||
match wam.indices.modules.get_mut(&module_name) {
|
match wam.indices.modules.get_mut(&module_name) {
|
||||||
Some(module) => {
|
Some(module) => {
|
||||||
let code_dir = mem::replace(&mut indices.code_dir, CodeDir::new());
|
let mut 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)) {
|
// replace the "user" module src's in the indices with module_name.
|
||||||
if let Some(idx) = wam.indices.code_dir.get(&(name.clone(), arity)) {
|
for (_, idx) in code_dir.iter_mut() {
|
||||||
if module.module_decl.name == module_name {
|
let p = idx.0.borrow().0;
|
||||||
if module_code.len() > 0 {
|
set_code_index!(idx, p, module_name.clone());
|
||||||
set_code_index!(idx, IndexPtr::Index(wam.code_repo.code.len()),
|
|
||||||
module_name.clone());
|
|
||||||
} else {
|
|
||||||
set_code_index!(idx, IndexPtr::Undefined, module_name.clone());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
module.code_dir.extend(code_dir);
|
||||||
},
|
},
|
||||||
_ => unreachable!()
|
_ => unreachable!()
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -26,12 +26,12 @@ impl Machine {
|
|||||||
|
|
||||||
match module.as_str() {
|
match module.as_str() {
|
||||||
"user" => compile_user_module(self, src),
|
"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)
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -176,7 +176,7 @@ impl SubModuleUser for Module {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn get_code_index(&self, key: PredicateKey, _: ClauseName) -> Option<CodeIndex> {
|
fn get_code_index(&self, key: PredicateKey, _: ClauseName) -> Option<CodeIndex> {
|
||||||
self.code_dir.get(&key).cloned().map(CodeIndex::from)
|
self.code_dir.get(&key).cloned()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn remove_code_index(&mut self, key: PredicateKey) {
|
fn remove_code_index(&mut self, key: PredicateKey) {
|
||||||
|
|||||||
Reference in New Issue
Block a user