]> Repositorios git - scryer-prolog.git/commitdiff
fail on undefined multifile/discontiguous/dynamic predicates (#915)
authorMark Thom <[email protected]>
Sat, 1 May 2021 03:46:50 +0000 (21:46 -0600)
committerMark Thom <[email protected]>
Sat, 1 May 2021 03:46:50 +0000 (21:46 -0600)
src/machine/loader.rs

index 3a5d40920930799327a74cc04ebce18529fb28e1..c33582a75fdfb0d306ebb57d019cbed75a388ccd 100644 (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(