fail on undefined multifile/discontiguous/dynamic predicates
@@ -1072,6 +1072,8 @@ fn add_extensible_predicate_declaration(
}
}
+ self.fail_on_undefined(&compilation_target, key);
+
Ok(())
} else {
Err(SessionError::PredicateNotMultifileOrDiscontiguous(
@@ -1081,6 +1083,27 @@ fn add_extensible_predicate_declaration(
}
}
+ 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 @@ fn add_dynamic_predicate(
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(
