continue;
}
- 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());
-
- return Err(SessionError::CannotOverwriteDynamicClause(err_str));
- }
- }
+ wam.check_dynamic_clause_overwrite(name.clone(), arity)?;
let predicate = Predicate(heads_and_tails.into_iter().map(|(head, tail)| {
let clause = Term::Clause(Cell::default(), clause_name!("clause"),
}
}
- fn remove_code_index(&mut self, key: PredicateKey) {
+ fn remove_code_index(&mut self, key: PredicateKey)
+ {
self.code_dir.remove(&key);
+
+ if self.dynamic_code_dir.contains_key(&key) {
+ self.dynamic_code_dir.remove(&key);
+ }
}
fn insert_dir_entry(&mut self, name: ClauseName, arity: usize, idx: ModuleCodeIndex)
self.machine_st.flags
}
+ pub fn check_dynamic_clause_overwrite(&self, name: ClauseName, arity: usize)
+ -> Result<(), SessionError>
+ {
+ if let Some(info) = self.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, self.indices.atom_tbl());
+
+ return Err(SessionError::CannotOverwriteDynamicClause(err_str));
+ }
+ }
+
+ Ok(())
+ }
+
pub fn check_toplevel_code(&self, indices: &IndexStore) -> Result<(), SessionError>
{
for (key, idx) in &indices.code_dir {
}
};
+ self.check_dynamic_clause_overwrite(key.0.clone(), key.1)?;
+
if let Some(ref existing_idx) = self.indices.code_dir.get(&key) {
// ensure we don't try to overwrite an existing predicate from a different module.
if !existing_idx.is_undefined() && !idx.is_undefined() {
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;
}
pub fn use_qualified_module<User>(user: &mut User, submodule: &Module, exports: &Vec<PredicateKey>)
- -> Result<(), SessionError>
+ -> Result<(), SessionError>
where User: SubModuleUser
{
for (name, arity) in exports.iter().cloned() {
Ok(())
}
-pub fn use_module<User: SubModuleUser>(user: &mut User, submodule: &Module)
- -> Result<(), SessionError>
+pub fn use_module<User: SubModuleUser>(user: &mut User, submodule: &Module) -> Result<(), SessionError>
{
for (name, arity) in submodule.module_decl.exports.iter().cloned() {
if !user.import_decl(name, arity, submodule) {