From: Mark Thom Date: Thu, 7 Mar 2019 05:33:16 +0000 (-0700) Subject: update toplevel exports when updated dynamically X-Git-Tag: v0.8.110~201 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=d4de3c20032018ef1c58bda13bbea881d2e42163;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 58eebb04..9c7cd015 100644 --- a/src/prolog/machine/compile.rs +++ b/src/prolog/machine/compile.rs @@ -159,7 +159,8 @@ pub fn compile_term(wam: &mut Machine, packet: TopLevelPacket) -> EvalSession } pub(super) -fn compile_into_module(wam: &mut Machine, src: R, name: ClauseName) -> EvalSession +fn compile_into_module(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(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())?; diff --git a/src/prolog/machine/dynamic_database.rs b/src/prolog/machine/dynamic_database.rs index d4549ae2..296a5906 100644 --- a/src/prolog/machine/dynamic_database.rs +++ b/src/prolog/machine/dynamic_database.rs @@ -17,11 +17,11 @@ impl Machine { } } - fn compile_into_machine(&mut self, src: R, name: ClauseName) -> EvalSession + fn compile_into_machine(&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) diff --git a/src/prolog/machine/mod.rs b/src/prolog/machine/mod.rs index f950dfaf..99ab07ed 100644 --- a/src/prolog/machine/mod.rs +++ b/src/prolog/machine/mod.rs @@ -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 {