properly update dynamically updated predicates in module indices
This commit is contained in:
@@ -183,7 +183,7 @@ fn compile_into_module<R: Read>(wam: &mut Machine, module_name: ClauseName, src:
|
|||||||
|
|
||||||
if module.module_decl.exports.contains(&(name.clone(), arity)) {
|
if module.module_decl.exports.contains(&(name.clone(), arity)) {
|
||||||
if let Some(idx) = wam.indices.code_dir.get(&(name.clone(), arity)) {
|
if let Some(idx) = wam.indices.code_dir.get(&(name.clone(), arity)) {
|
||||||
if module.module_decl.name == idx.0.borrow().1 {
|
if module.module_decl.name == module_name {
|
||||||
if module_code.len() > 0 {
|
if module_code.len() > 0 {
|
||||||
set_code_index!(idx, IndexPtr::Index(wam.code_repo.code.len()),
|
set_code_index!(idx, IndexPtr::Index(wam.code_repo.code.len()),
|
||||||
module_name.clone());
|
module_name.clone());
|
||||||
@@ -423,11 +423,8 @@ impl ListingCompiler {
|
|||||||
|
|
||||||
let idx = code_dir.entry((name.clone(), arity)).or_insert(CodeIndex::default());
|
let idx = code_dir.entry((name.clone(), arity)).or_insert(CodeIndex::default());
|
||||||
set_code_index!(idx, IndexPtr::Index(p), self.get_module_name());
|
set_code_index!(idx, IndexPtr::Index(p), self.get_module_name());
|
||||||
/*
|
|
||||||
println!("{}/{}:", name.as_str(), arity);
|
self.localize_self_calls(name, arity, &mut decl_code, p);
|
||||||
print_code(&decl_code);
|
|
||||||
*/
|
|
||||||
self.localize_self_calls(name, arity, &mut decl_code, p);
|
|
||||||
code.extend(decl_code.into_iter());
|
code.extend(decl_code.into_iter());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -104,7 +104,6 @@ impl SubModuleUser for IndexStore {
|
|||||||
fn remove_code_index(&mut self, key: PredicateKey)
|
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: CodeIndex)
|
fn insert_dir_entry(&mut self, name: ClauseName, arity: usize, idx: CodeIndex)
|
||||||
@@ -222,11 +221,11 @@ impl Machine {
|
|||||||
// ensure we don't try to overwrite the name/arity of a builtin.
|
// ensure we don't try to overwrite the name/arity of a builtin.
|
||||||
let err_str = format!("{}/{}", key.0, key.1);
|
let err_str = format!("{}/{}", key.0, key.1);
|
||||||
let err_str = clause_name!(err_str, self.indices.atom_tbl());
|
let err_str = clause_name!(err_str, self.indices.atom_tbl());
|
||||||
|
|
||||||
return Err(SessionError::CannotOverwriteBuiltIn(err_str));
|
return Err(SessionError::CannotOverwriteBuiltIn(err_str));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(ref existing_idx) = self.indices.code_dir.get(&key) {
|
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.
|
// ensure we don't try to overwrite an existing predicate from a different module.
|
||||||
if !existing_idx.is_undefined() && !idx.is_undefined() {
|
if !existing_idx.is_undefined() && !idx.is_undefined() {
|
||||||
@@ -239,7 +238,7 @@ impl Machine {
|
|||||||
let err_str = format!("{}/{} from module {}", key.0, key.1,
|
let err_str = format!("{}/{} from module {}", key.0, key.1,
|
||||||
existing_idx.module_name().as_str());
|
existing_idx.module_name().as_str());
|
||||||
let err_str = clause_name!(err_str, self.indices.atom_tbl());
|
let err_str = clause_name!(err_str, self.indices.atom_tbl());
|
||||||
|
|
||||||
return Err(SessionError::CannotOverwriteImport(err_str));
|
return Err(SessionError::CannotOverwriteImport(err_str));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -248,7 +247,7 @@ impl Machine {
|
|||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_batched_code(&mut self, code: Code, code_dir: CodeDir)
|
pub fn add_batched_code(&mut self, code: Code, code_dir: CodeDir)
|
||||||
{
|
{
|
||||||
// error detection has finished, so update the master index of keys.
|
// error detection has finished, so update the master index of keys.
|
||||||
@@ -291,7 +290,7 @@ impl Machine {
|
|||||||
PrinterOutputter::new())
|
PrinterOutputter::new())
|
||||||
.result();
|
.result();
|
||||||
|
|
||||||
let err_str = clause_name!(err_str, self.indices.atom_tbl());
|
let err_str = clause_name!(err_str, self.indices.atom_tbl());
|
||||||
EvalSession::from(SessionError::QueryFailureWithException(err_str))
|
EvalSession::from(SessionError::QueryFailureWithException(err_str))
|
||||||
} else {
|
} else {
|
||||||
EvalSession::from(SessionError::QueryFailure)
|
EvalSession::from(SessionError::QueryFailure)
|
||||||
|
|||||||
Reference in New Issue
Block a user