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

index 58eebb04c78005b9a1bedad571bb0c48b9d1e617..9c7cd0159f824118eb8fa2ae5a4f0976038fa87e 100644 (file)
@@ -159,7 +159,8 @@ pub fn compile_term(wam: &mut Machine, packet: TopLevelPacket) -> EvalSession
 }
 
 pub(super)
-fn compile_into_module<R: Read>(wam: &mut Machine, src: R, name: ClauseName) -> EvalSession
+fn compile_into_module<R: Read>(wam: &mut Machine, src: R, name: ClauseName, arity: usize)
+                                -> EvalSession
 {
     let mut indices = default_index_store!(wam.atom_tbl_of(&name));
     try_eval_session!(setup_indices(wam, name.owning_module(), &mut indices));
@@ -178,6 +179,13 @@ fn compile_into_module<R: Read>(wam: &mut Machine, src: R, name: ClauseName) ->
         Some(module) => {
             let code_dir = mem::replace(&mut indices.code_dir, CodeDir::new());
             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);
+                }
+            }
         },
         _ => unreachable!()
     };
@@ -225,7 +233,7 @@ impl ClauseCodeGenerator {
                 PredicateClause::Fact(clause)
             }).collect());
 
-            let p = self.code.len() + wam.code_size() + self.len_offset;
+            let p = self.code.len() + wam.code_repo.code.len() + self.len_offset;
             let mut decl_code = compile_relation(&TopLevel::Predicate(predicate), false,
                                                  wam.machine_flags())?;
 
@@ -403,7 +411,7 @@ impl ListingCompiler {
             let (name, arity) = decl.predicate_indicator().ok_or(SessionError::NamelessEntry)?;
             let non_counted_bt = self.non_counted_bt_preds.contains(&(name.clone(), arity));
 
-            let p = code.len() + wam.code_size() + code_offset;
+            let p = code.len() + wam.code_repo.code.len() + code_offset;
             let mut decl_code = compile_relation(&TopLevel::Predicate(decl), non_counted_bt,
                                                  wam.machine_flags())?;
 
index d4549ae2dfd30fb034dbd892399a85a9e352cde2..296a5906ed54de1588fe3d755fedb0195a2a8e56 100644 (file)
@@ -17,11 +17,11 @@ impl Machine {
         }
     }
 
-    fn compile_into_machine<R: Read>(&mut self, src: R, name: ClauseName) -> EvalSession
+    fn compile_into_machine<R: Read>(&mut self, src: R, name: ClauseName, arity: usize) -> EvalSession
     {
         match name.owning_module().as_str() {
             "user" => compile_user_module(self, src),
-            _ => compile_into_module(self, src, name)
+            _ => compile_into_module(self, src, name, arity)
         }
     }
 
@@ -102,11 +102,11 @@ impl Machine {
     }
     
     fn handle_eval_result_from_dynamic_compile(&mut self, pred_str: String, name: ClauseName,
-                                               src: ClauseName)
+                                               arity: usize, src: ClauseName)
     {
         let machine_st = mem::replace(&mut self.machine_st, MachineState::new());
 
-        let result = self.compile_into_machine(pred_str.as_bytes(), name);
+        let result = self.compile_into_machine(pred_str.as_bytes(), name, arity);
         self.machine_st = machine_st;
 
         if let EvalSession::Error(err) = result {
@@ -135,7 +135,7 @@ impl Machine {
                 return self.machine_st.throw_exception(err)
         };
 
-        self.handle_eval_result_from_dynamic_compile(pred_str, name, place.predicate_name());
+        self.handle_eval_result_from_dynamic_compile(pred_str, name, arity, place.predicate_name());
     }
 
     fn set_module_atom_tbl(&mut self, module_addr: Addr, name: &mut ClauseName) -> bool
@@ -223,7 +223,7 @@ impl Machine {
                 return self.machine_st.throw_exception(err)
         };
 
-        self.handle_eval_result_from_dynamic_compile(pred_str, name, clause_name!("retract"));
+        self.handle_eval_result_from_dynamic_compile(pred_str, name, arity, clause_name!("retract"));
     }
 
     pub(super)
index f950dfaf1cc9b155020918f479baa344118a4108..99ab07ed0ac6d8ddfb7f48fcf189292b528efb42 100644 (file)
@@ -294,10 +294,6 @@ impl Machine {
         self.code_repo.code.extend(code.into_iter());
     }
 
-    pub fn code_size(&self) -> usize {
-        self.code_repo.code.len()
-    }
-
     fn fail(&mut self) -> EvalSession
     {
         if self.machine_st.ball.stub.len() > 0 {