From: Mark Thom Date: Sat, 1 May 2021 03:46:50 +0000 (-0600) Subject: fail on undefined multifile/discontiguous/dynamic predicates (#915) X-Git-Tag: v0.9.0~93 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=bba836dc310cdd5cbc04ead1d100544a260e6369;p=scryer-prolog.git fail on undefined multifile/discontiguous/dynamic predicates (#915) --- diff --git a/src/machine/loader.rs b/src/machine/loader.rs index 3a5d4092..c33582a7 100644 --- a/src/machine/loader.rs +++ b/src/machine/loader.rs @@ -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(