From: Mark Thom Date: Thu, 7 Mar 2019 06:35:50 +0000 (-0700) Subject: update toplevel exports when updated dynamically X-Git-Tag: v0.8.110~200 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=72c8807ff1ebc5b7ba55eee9df23bcee40581fb4;p=scryer-prolog.git update toplevel exports when updated dynamically --- diff --git a/src/prolog/machine/compile.rs b/src/prolog/machine/compile.rs index 9c7cd015..6c8fcee3 100644 --- a/src/prolog/machine/compile.rs +++ b/src/prolog/machine/compile.rs @@ -149,7 +149,7 @@ pub fn compile_term(wam: &mut Machine, packet: TopLevelPacket) -> EvalSession let mut compiler = ListingCompiler::new(&wam.code_repo); let indices = try_eval_session!(compile_decl(wam, &mut compiler, decl)); - try_eval_session!(wam.check_toplevel_code(&indices)); + try_eval_session!(wam.check_toplevel_code(&indices, &DynamicClauseMap::new())); add_toplevel_code(wam, vec![], indices); EvalSession::EntrySuccess @@ -181,9 +181,16 @@ fn compile_into_module(wam: &mut Machine, src: R, name: ClauseName, ari module.code_dir.extend(as_module_code_dir(code_dir)); if module.module_decl.exports.contains(&(name.clone(), arity)) { - if let Some(idx) = wam.indices.code_dir.get(&(name.clone(), arity)) { - let module = name.owning_module(); - set_code_index!(idx, IndexPtr::Index(wam.code_repo.code.len()), module); + if let Some(idx) = wam.indices.code_dir.get(&(name.clone(), arity)) { + if module.module_decl.name == idx.0.borrow().1 { + let module = module.module_decl.name.clone(); + + if module_code.len() > 0 { + set_code_index!(idx, IndexPtr::Index(wam.code_repo.code.len()), module); + } else { + set_code_index!(idx, IndexPtr::Undefined, module); + } + } } } }, @@ -292,10 +299,10 @@ fn add_non_module_code(wam: &mut Machine, dynamic_clause_map: DynamicClauseMap, indices: IndexStore) -> Result<(), SessionError> { - let mut clause_code_generator = ClauseCodeGenerator::new(code.len()); + wam.check_toplevel_code(&indices, &dynamic_clause_map)?; + let mut clause_code_generator = ClauseCodeGenerator::new(code.len()); clause_code_generator.generate_clause_code(dynamic_clause_map, wam)?; - wam.check_toplevel_code(&indices)?; add_toplevel_code(wam, code, indices); clause_code_generator.add_clause_code(wam); @@ -601,8 +608,8 @@ fn compile_work(compiler: &mut ListingCompiler, wam: &mut Machine, src: if let Some(module) = compiler.module.take() { let mut clause_code_generator = ClauseCodeGenerator::new(module_code.len() + toplvl_code.len()); + try_eval_session!(wam.check_toplevel_code(&results.toplevel_indices, &results.dynamic_clause_map)); try_eval_session!(clause_code_generator.generate_clause_code(results.dynamic_clause_map, wam)); - try_eval_session!(wam.check_toplevel_code(&results.toplevel_indices)); add_module_code(wam, module, module_code, indices); add_toplevel_code(wam, toplvl_code, results.toplevel_indices); diff --git a/src/prolog/machine/mod.rs b/src/prolog/machine/mod.rs index 99ab07ed..e1b704a5 100644 --- a/src/prolog/machine/mod.rs +++ b/src/prolog/machine/mod.rs @@ -32,6 +32,7 @@ use prolog::machine::machine_errors::*; use prolog::machine::machine_indices::*; use prolog::machine::machine_state::*; use prolog::machine::modules::*; +use prolog::machine::toplevel::*; use std::collections::{HashMap, VecDeque}; use std::mem; @@ -225,7 +226,8 @@ impl Machine { Ok(()) } - pub fn check_toplevel_code(&self, indices: &IndexStore) -> Result<(), SessionError> + pub fn check_toplevel_code(&self, indices: &IndexStore, dynamic_clause_map: &DynamicClauseMap) + -> Result<(), SessionError> { for (key, idx) in &indices.code_dir { match ClauseType::from(key.0.clone(), key.1, None) { @@ -239,7 +241,9 @@ impl Machine { } }; - self.check_dynamic_clause_overwrite(key.0.clone(), key.1)?; + if dynamic_clause_map.contains_key(&key) { + self.check_dynamic_clause_overwrite(key.0.clone(), key.1)?; + } if let Some(ref existing_idx) = self.indices.code_dir.get(&key) { // ensure we don't try to overwrite an existing predicate from a different module.