]> Repositorios git - scryer-prolog.git/commitdiff
overwrite code indices of dynamic_undefined predicates (dynamic, multifile, discontig...
authorMark <[email protected]>
Tue, 25 Jul 2023 19:48:34 +0000 (13:48 -0600)
committerMark <[email protected]>
Tue, 25 Jul 2023 19:48:34 +0000 (13:48 -0600)
src/machine/load_state.rs
src/machine/loader.rs

index 56aa88eb5e978cc8942356f47d0b933c1a5d4868..8273ac41113625b67767b2dd74a95773486a190a 100644 (file)
@@ -133,7 +133,7 @@ pub(super) fn import_module_exports<'a, LS: LoadState<'a>>(
                     meta_predicates.insert(key, meta_specs.clone());
                 }
 
-                if let Some(src_code_index) = imported_module.code_dir.get(&key) {
+                if let Some(src_code_index) = imported_module.code_dir.get(&key).cloned() {
                     let arena = &mut LS::machine_st(payload).arena;
 
                     let target_code_index = code_dir
@@ -148,6 +148,10 @@ pub(super) fn import_module_exports<'a, LS: LoadState<'a>>(
                         target_code_index,
                         src_code_index.get(),
                     );
+
+                    if src_code_index.is_dynamic_undefined() {
+                        code_dir.insert(key, src_code_index);
+                    }
                 } else {
                     return Err(SessionError::ModuleDoesNotContainExport(
                         imported_module.module_decl.name,
index b65c235133e327aad98e7b883c7b41f326e1373a..9d66ce64b908b43aaaf1c39ef8c2135984ccd2a6 100644 (file)
@@ -1631,23 +1631,16 @@ impl Machine {
             usize,
         ) -> Result<(), SessionError>,
     ) -> CallResult {
-        let module_name = cell_as_atom!(
-            self.machine_st.store(self.machine_st.deref(self.machine_st.registers[1]))
-        );
+        let module_name = cell_as_atom!(self.deref_register(1));
 
         let compilation_target = match module_name {
             atom!("user") => CompilationTarget::User,
             _ => CompilationTarget::Module(module_name),
         };
 
-        let predicate_name = cell_as_atom!(
-            self.machine_st.store(self.machine_st.deref(self.machine_st.registers[2]))
-        );
-
-        let arity = self
-            .machine_st
-            .store(self.machine_st.deref(self.machine_st.registers[3]));
+        let predicate_name = cell_as_atom!(self.deref_register(2));
 
+        let arity = self.deref_register(3);
         let arity = match Number::try_from(arity) {
             Ok(Number::Integer(n)) if &*n >= &Integer::from(0) && &*n <= &Integer::from(MAX_ARITY) => Ok(n.to_usize().unwrap()),
             Ok(Number::Fixnum(n)) if n.get_num() >= 0 && n.get_num() <= MAX_ARITY as i64 => {