fail on undefined multifile/discontiguous/dynamic predicates (#915)

This commit is contained in:
Mark Thom
2021-04-30 21:46:50 -06:00
parent 14fc8e2efa
commit bba836dc31

View File

@@ -1072,6 +1072,8 @@ impl<'a, TS: TermStream> Loader<'a, TS> {
}
}
self.fail_on_undefined(&compilation_target, key);
Ok(())
} else {
Err(SessionError::PredicateNotMultifileOrDiscontiguous(
@@ -1081,6 +1083,27 @@ impl<'a, TS: TermStream> Loader<'a, TS> {
}
}
fn fail_on_undefined(&mut self, compilation_target: &CompilationTarget, key: PredicateKey) {
/*
* DynamicUndefined isn't only applied to dynamic predicates
* but to multifile and discontiguous predicates as well.
*/
let code_index = self
.load_state
.get_or_insert_code_index(key.clone(), compilation_target.clone());
if let IndexPtr::Undefined = code_index.get() {
set_code_index(
&mut self.load_state.retraction_info,
compilation_target,
key,
&code_index,
IndexPtr::DynamicUndefined,
);
}
}
fn add_discontiguous_predicate(
&mut self,
compilation_target: CompilationTarget,
@@ -1108,23 +1131,7 @@ impl<'a, TS: TermStream> Loader<'a, TS> {
arity,
|skeleton| &mut skeleton.is_dynamic,
RetractionRecord::AddedDynamicPredicate,
)?;
let code_index = self
.load_state
.get_or_insert_code_index((name.clone(), arity), compilation_target.clone());
if let IndexPtr::Undefined = code_index.get() {
set_code_index(
&mut self.load_state.retraction_info,
&compilation_target,
(name, arity),
&code_index,
IndexPtr::DynamicUndefined,
);
}
Ok(())
)
}
fn add_multifile_predicate(