split dynamic database keys across modules

This commit is contained in:
Mark Thom
2019-03-08 21:22:15 -07:00
parent 267d1a9f5f
commit 089428b8c4
11 changed files with 95 additions and 126 deletions

View File

@@ -32,7 +32,6 @@ use prolog::machine::machine_errors::*;
use prolog::machine::machine_indices::*;
use prolog::machine::machine_state::*;
use prolog::machine::modules::*;
use prolog::machine::toplevel::*;
use std::collections::{HashMap, VecDeque};
use std::mem;
@@ -104,21 +103,23 @@ impl SubModuleUser for IndexStore {
fn remove_code_index(&mut self, key: PredicateKey)
{
self.code_dir.remove(&key);
self.code_dir.remove(&key);
self.dynamic_code_dir.remove(&(key.0.owning_module(), key.0, key.1));
}
fn insert_dir_entry(&mut self, name: ClauseName, arity: usize, idx: ModuleCodeIndex)
fn insert_dir_entry(&mut self, name: ClauseName, arity: usize, idx: CodeIndex)
{
if let Some(ref mut code_idx) = self.code_dir.get_mut(&(name.clone(), arity)) {
if let Some(ref code_idx) = self.code_dir.get(&(name.clone(), arity)) {
if !code_idx.is_undefined() {
println!("warning: overwriting {}/{}", &name, arity);
}
set_code_index!(code_idx, idx.0, idx.1);
let (p, module_name) = idx.0.borrow().clone();
set_code_index!(code_idx, p, module_name);
return;
}
self.code_dir.insert((name, arity), CodeIndex::from(idx));
self.code_dir.insert((name, arity), idx);
}
fn use_qualified_module(&mut self, code_repo: &mut CodeRepo, flags: MachineFlags,
@@ -210,23 +211,7 @@ impl Machine {
self.machine_st.flags
}
pub fn check_dynamic_clause_overwrite(&self, name: ClauseName, arity: usize, module: ClauseName)
-> Result<(), SessionError>
{
if let Some(info) = self.indices.dynamic_code_dir.get(&(name.clone(), arity)) {
if info.module_src != 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, dynamic_clause_map: &DynamicClauseMap)
-> Result<(), SessionError>
pub fn check_toplevel_code(&self, indices: &IndexStore) -> Result<(), SessionError>
{
for (key, idx) in &indices.code_dir {
match ClauseType::from(key.0.clone(), key.1, None) {
@@ -239,11 +224,6 @@ impl Machine {
return Err(SessionError::CannotOverwriteBuiltIn(err_str));
}
};
if dynamic_clause_map.contains_key(&key) {
let module = idx.0.borrow().1.clone();
self.check_dynamic_clause_overwrite(key.0.clone(), key.1, module)?;
}
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.