give dynamic predicates a better respect for module bounds
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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 =>
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user