]> Repositorios git - scryer-prolog.git/commitdiff
update toplevel exports when updated dynamically
authorMark Thom <[email protected]>
Thu, 7 Mar 2019 06:35:50 +0000 (23:35 -0700)
committerMark Thom <[email protected]>
Thu, 7 Mar 2019 06:35:50 +0000 (23:35 -0700)
src/prolog/machine/compile.rs
src/prolog/machine/mod.rs

index 9c7cd0159f824118eb8fa2ae5a4f0976038fa87e..6c8fcee343f63ee8c4dfb0e2035e57b16027653e 100644 (file)
@@ -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<R: Read>(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<R: Read>(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);
index 99ab07ed0ac6d8ddfb7f48fcf189292b528efb42..e1b704a5970e0e58dd2fb0bca875f1d1e36e853e 100644 (file)
@@ -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.