match wam.indices.modules.get_mut(&name.owning_module()) {
Some(module) => {
- let code_dir = mem::replace(&mut indices.code_dir, CodeDir::new());
- module.code_dir.extend(as_module_code_dir(code_dir));
+ let code_dir = mem::replace(&mut indices.code_dir, CodeDir::new());
+ module.code_dir.extend(as_module_code_dir(code_dir));
},
_ => unreachable!()
};
-
+
wam.code_repo.code.extend(module_code.into_iter());
clause_code_generator.add_clause_code(wam);
-
+
EvalSession::EntrySuccess
}
continue;
}
- if let Some(idx) = wam.indices.code_dir.get(&(name.clone(), arity)) {
- if !idx.is_undefined() && name.owning_module() != idx.module_name() {
+ if let Some(info) = wam.indices.dynamic_code_dir.get(&(name.clone(), arity)) {
+ if info.module_src != name.owning_module() {
let err_str = format!("{}/{}", name.as_str(), arity);
let err_str = clause_name!(err_str, wam.indices.atom_tbl());
wam.code_repo.code.extend(self.code.into_iter());
for ((name, arity), p) in self.pi_to_loc {
- let entry = wam.indices.dynamic_code_dir.entry((name, arity))
+ let entry = wam.indices.dynamic_code_dir.entry((name.clone(), arity))
.or_insert(DynamicPredicateInfo::default());
+
entry.clauses_subsection_p = p;
+ entry.module_src = name.owning_module();
}
}
}
-> Result<GatherResult, SessionError>
{
let flags = wam.machine_flags();
- let atom_tbl = wam.indices.atom_tbl.clone();
+ let atom_tbl = indices.atom_tbl.clone();
let mut worker = TopLevelBatchWorker::new(src, atom_tbl.clone(), flags,
&mut wam.indices, &mut wam.policies,
&mut wam.code_repo);
pub(super) fn session_error(h: usize, err: SessionError) -> Self {
match err {
SessionError::ParserError(err) => Self::syntax_error(h, err),
- SessionError::CannotOverwriteBuiltIn(pred_str)
+ SessionError::CannotOverwriteDynamicClause(pred_str)
+ | SessionError::CannotOverwriteBuiltIn(pred_str)
| SessionError::CannotOverwriteImport(pred_str) =>
Self::permission_error(PermissionError::Modify, pred_str),
SessionError::ModuleDoesNotContainExport =>
pub type HeapVarDict = HashMap<Rc<Var>, Addr>;
pub type AllocVarDict = HashMap<Rc<Var>, VarData>;
-#[derive(Copy, Clone)]
+#[derive(Clone)]
pub struct DynamicPredicateInfo {
pub(super) clauses_subsection_p: usize, // a LocalCodePtr::DirEntry value.
+ pub(super) module_src: ClauseName // the module the predicate is defined within.
}
impl Default for DynamicPredicateInfo {
fn default() -> Self {
- DynamicPredicateInfo { clauses_subsection_p: 0 }
+ DynamicPredicateInfo { clauses_subsection_p: 0,
+ module_src: clause_name!("user") }
}
}
module.code_dir.contains_key(&(name, arity)),
ClauseType::Op(op_decl, ..) =>
module.code_dir.contains_key(&(op_decl.name(), op_decl.arity())),
- _ => true
+ _ =>
+ true
},
None =>
match ClauseType::from(name, arity, op_spec) {
self.code_dir.contains_key(&(name, arity)),
ClauseType::Op(op_decl, ..) =>
self.code_dir.contains_key(&(op_decl.name(), op_decl.arity())),
- _ => true
+ _ =>
+ true
}
}
}
fn insert_dir_entry(&mut self, ClauseName, usize, ModuleCodeIndex);
- fn remove_module(&mut self, mod_name: ClauseName, module: &Module) {
+ fn remove_module(&mut self, mod_name: ClauseName, module: &Module)
+ {
for (name, arity) in module.module_decl.exports.iter().cloned() {
let name = name.defrock_brackets();
self.remove_code_index((name.clone(), arity));
+
// remove or respecify ops.
if arity == 2 {
if let Some((_, _, mod_name)) = self.op_dir().get(&(name.clone(), Fixity::In)).cloned()
}
// returns true on successful import.
- fn import_decl(&mut self, name: ClauseName, arity: usize, submodule: &Module) -> bool {
+ fn import_decl(&mut self, name: ClauseName, arity: usize, submodule: &Module) -> bool
+ {
let name = name.defrock_brackets();
let mut found_op = false;