From 3b67ffa814c1bd584ffe011b6d330734601f57bb Mon Sep 17 00:00:00 2001 From: Mark Date: Tue, 25 Jul 2023 13:48:34 -0600 Subject: [PATCH] overwrite code indices of dynamic_undefined predicates (dynamic, multifile, discontiguous) on export --- src/machine/load_state.rs | 6 +++++- src/machine/loader.rs | 13 +++---------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/machine/load_state.rs b/src/machine/load_state.rs index 56aa88eb..8273ac41 100644 --- a/src/machine/load_state.rs +++ b/src/machine/load_state.rs @@ -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, diff --git a/src/machine/loader.rs b/src/machine/loader.rs index b65c2351..9d66ce64 100644 --- a/src/machine/loader.rs +++ b/src/machine/loader.rs @@ -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 => { -- 2.54.0