update toplevel exports when updated dynamically
This commit is contained in:
@@ -159,7 +159,8 @@ pub fn compile_term(wam: &mut Machine, packet: TopLevelPacket) -> EvalSession
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(super)
|
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));
|
let mut indices = default_index_store!(wam.atom_tbl_of(&name));
|
||||||
try_eval_session!(setup_indices(wam, name.owning_module(), &mut indices));
|
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) => {
|
Some(module) => {
|
||||||
let code_dir = mem::replace(&mut indices.code_dir, CodeDir::new());
|
let code_dir = mem::replace(&mut indices.code_dir, CodeDir::new());
|
||||||
module.code_dir.extend(as_module_code_dir(code_dir));
|
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!()
|
_ => unreachable!()
|
||||||
};
|
};
|
||||||
@@ -225,7 +233,7 @@ impl ClauseCodeGenerator {
|
|||||||
PredicateClause::Fact(clause)
|
PredicateClause::Fact(clause)
|
||||||
}).collect());
|
}).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,
|
let mut decl_code = compile_relation(&TopLevel::Predicate(predicate), false,
|
||||||
wam.machine_flags())?;
|
wam.machine_flags())?;
|
||||||
|
|
||||||
@@ -403,7 +411,7 @@ impl ListingCompiler {
|
|||||||
let (name, arity) = decl.predicate_indicator().ok_or(SessionError::NamelessEntry)?;
|
let (name, arity) = decl.predicate_indicator().ok_or(SessionError::NamelessEntry)?;
|
||||||
let non_counted_bt = self.non_counted_bt_preds.contains(&(name.clone(), arity));
|
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,
|
let mut decl_code = compile_relation(&TopLevel::Predicate(decl), non_counted_bt,
|
||||||
wam.machine_flags())?;
|
wam.machine_flags())?;
|
||||||
|
|
||||||
|
|||||||
@@ -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() {
|
match name.owning_module().as_str() {
|
||||||
"user" => compile_user_module(self, src),
|
"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,
|
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 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;
|
self.machine_st = machine_st;
|
||||||
|
|
||||||
if let EvalSession::Error(err) = result {
|
if let EvalSession::Error(err) = result {
|
||||||
@@ -135,7 +135,7 @@ impl Machine {
|
|||||||
return self.machine_st.throw_exception(err)
|
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
|
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)
|
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)
|
pub(super)
|
||||||
|
|||||||
@@ -294,10 +294,6 @@ impl Machine {
|
|||||||
self.code_repo.code.extend(code.into_iter());
|
self.code_repo.code.extend(code.into_iter());
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn code_size(&self) -> usize {
|
|
||||||
self.code_repo.code.len()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn fail(&mut self) -> EvalSession
|
fn fail(&mut self) -> EvalSession
|
||||||
{
|
{
|
||||||
if self.machine_st.ball.stub.len() > 0 {
|
if self.machine_st.ball.stub.len() > 0 {
|
||||||
|
|||||||
Reference in New Issue
Block a user