give dynamic predicates a better respect for module bounds

This commit is contained in:
Mark Thom
2019-03-06 00:51:21 -07:00
parent 6439d09733
commit c8ea788720
4 changed files with 25 additions and 15 deletions

View File

@@ -216,8 +216,8 @@ impl ClauseCodeGenerator {
continue; continue;
} }
if let Some(idx) = wam.indices.code_dir.get(&(name.clone(), arity)) { if let Some(info) = wam.indices.dynamic_code_dir.get(&(name.clone(), arity)) {
if !idx.is_undefined() && name.owning_module() != idx.module_name() { if info.module_src != name.owning_module() {
let err_str = format!("{}/{}", name.as_str(), arity); let err_str = format!("{}/{}", name.as_str(), arity);
let err_str = clause_name!(err_str, wam.indices.atom_tbl()); let err_str = clause_name!(err_str, wam.indices.atom_tbl());
@@ -249,9 +249,11 @@ impl ClauseCodeGenerator {
wam.code_repo.code.extend(self.code.into_iter()); wam.code_repo.code.extend(self.code.into_iter());
for ((name, arity), p) in self.pi_to_loc { 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()); .or_insert(DynamicPredicateInfo::default());
entry.clauses_subsection_p = p; entry.clauses_subsection_p = p;
entry.module_src = name.owning_module();
} }
} }
} }
@@ -525,7 +527,7 @@ impl ListingCompiler {
-> Result<GatherResult, SessionError> -> Result<GatherResult, SessionError>
{ {
let flags = wam.machine_flags(); 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, let mut worker = TopLevelBatchWorker::new(src, atom_tbl.clone(), flags,
&mut wam.indices, &mut wam.policies, &mut wam.indices, &mut wam.policies,
&mut wam.code_repo); &mut wam.code_repo);

View File

@@ -66,7 +66,8 @@ impl MachineError {
pub(super) fn session_error(h: usize, err: SessionError) -> Self { pub(super) fn session_error(h: usize, err: SessionError) -> Self {
match err { match err {
SessionError::ParserError(err) => Self::syntax_error(h, 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) => | SessionError::CannotOverwriteImport(pred_str) =>
Self::permission_error(PermissionError::Modify, pred_str), Self::permission_error(PermissionError::Modify, pred_str),
SessionError::ModuleDoesNotContainExport => SessionError::ModuleDoesNotContainExport =>

View File

@@ -365,14 +365,16 @@ impl AddAssign<usize> for CodePtr {
pub type HeapVarDict = HashMap<Rc<Var>, Addr>; pub type HeapVarDict = HashMap<Rc<Var>, Addr>;
pub type AllocVarDict = HashMap<Rc<Var>, VarData>; pub type AllocVarDict = HashMap<Rc<Var>, VarData>;
#[derive(Copy, Clone)] #[derive(Clone)]
pub struct DynamicPredicateInfo { pub struct DynamicPredicateInfo {
pub(super) clauses_subsection_p: usize, // a LocalCodePtr::DirEntry value. 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 { impl Default for DynamicPredicateInfo {
fn default() -> Self { fn default() -> Self {
DynamicPredicateInfo { clauses_subsection_p: 0 } DynamicPredicateInfo { clauses_subsection_p: 0,
module_src: clause_name!("user") }
} }
} }
@@ -400,7 +402,8 @@ impl IndexStore {
module.code_dir.contains_key(&(name, arity)), module.code_dir.contains_key(&(name, arity)),
ClauseType::Op(op_decl, ..) => ClauseType::Op(op_decl, ..) =>
module.code_dir.contains_key(&(op_decl.name(), op_decl.arity())), module.code_dir.contains_key(&(op_decl.name(), op_decl.arity())),
_ => true _ =>
true
}, },
None => None =>
match ClauseType::from(name, arity, op_spec) { match ClauseType::from(name, arity, op_spec) {
@@ -408,7 +411,8 @@ impl IndexStore {
self.code_dir.contains_key(&(name, arity)), self.code_dir.contains_key(&(name, arity)),
ClauseType::Op(op_decl, ..) => ClauseType::Op(op_decl, ..) =>
self.code_dir.contains_key(&(op_decl.name(), op_decl.arity())), self.code_dir.contains_key(&(op_decl.name(), op_decl.arity())),
_ => true _ =>
true
} }
} }
} }

View File

@@ -71,7 +71,8 @@ pub trait SubModuleUser
fn insert_dir_entry(&mut self, ClauseName, usize, ModuleCodeIndex); 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() { for (name, arity) in module.module_decl.exports.iter().cloned() {
let name = name.defrock_brackets(); let name = name.defrock_brackets();
@@ -83,6 +84,7 @@ pub trait SubModuleUser
self.remove_code_index((name.clone(), arity)); self.remove_code_index((name.clone(), arity));
// remove or respecify ops. // remove or respecify ops.
if arity == 2 { if arity == 2 {
if let Some((_, _, mod_name)) = self.op_dir().get(&(name.clone(), Fixity::In)).cloned() if let Some((_, _, mod_name)) = self.op_dir().get(&(name.clone(), Fixity::In)).cloned()
@@ -113,7 +115,8 @@ pub trait SubModuleUser
} }
// returns true on successful import. // 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 name = name.defrock_brackets();
let mut found_op = false; let mut found_op = false;