}
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));
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!()
};
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())?;
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())?;
}
}
- 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)
}
}
}
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 {
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
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)