propagate dynamic database changes to toplevel
This commit is contained in:
@@ -158,6 +158,33 @@ pub fn compile_term(wam: &mut Machine, packet: TopLevelPacket) -> EvalSession
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn update_module_indices(wam: &Machine, module_name: ClauseName, mut indices: IndexStore)
|
||||||
|
{
|
||||||
|
match wam.indices.modules.get(&module_name) {
|
||||||
|
Some(module) => {
|
||||||
|
let mut code_dir = mem::replace(&mut indices.code_dir, CodeDir::new());
|
||||||
|
|
||||||
|
// replace the "user" module src's in the indices with module_name.
|
||||||
|
for (key, idx) in code_dir.iter_mut() {
|
||||||
|
let p = idx.0.borrow().0;
|
||||||
|
|
||||||
|
match module.code_dir.get(&key) {
|
||||||
|
Some(idx) => set_code_index!(idx, p, module_name.clone()),
|
||||||
|
_ => unreachable!()
|
||||||
|
}
|
||||||
|
|
||||||
|
match wam.indices.code_dir.get(&key) {
|
||||||
|
Some(idx) => if idx.0.borrow().1 == module_name {
|
||||||
|
set_code_index!(idx, p, module_name.clone());
|
||||||
|
},
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_ => unreachable!()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
pub(super)
|
pub(super)
|
||||||
fn compile_into_module<R: Read>(wam: &mut Machine, module_name: ClauseName, src: R, name: ClauseName)
|
fn compile_into_module<R: Read>(wam: &mut Machine, module_name: ClauseName, src: R, name: ClauseName)
|
||||||
-> EvalSession
|
-> EvalSession
|
||||||
@@ -175,20 +202,7 @@ fn compile_into_module<R: Read>(wam: &mut Machine, module_name: ClauseName, src:
|
|||||||
try_eval_session!(clause_code_generator.generate_clause_code(results.dynamic_clause_map,
|
try_eval_session!(clause_code_generator.generate_clause_code(results.dynamic_clause_map,
|
||||||
wam));
|
wam));
|
||||||
|
|
||||||
match wam.indices.modules.get_mut(&module_name) {
|
update_module_indices(wam, module_name, indices);
|
||||||
Some(module) => {
|
|
||||||
let mut code_dir = mem::replace(&mut indices.code_dir, CodeDir::new());
|
|
||||||
|
|
||||||
// replace the "user" module src's in the indices with module_name.
|
|
||||||
for (_, idx) in code_dir.iter_mut() {
|
|
||||||
let p = idx.0.borrow().0;
|
|
||||||
set_code_index!(idx, p, module_name.clone());
|
|
||||||
}
|
|
||||||
|
|
||||||
module.code_dir.extend(code_dir);
|
|
||||||
},
|
|
||||||
_ => unreachable!()
|
|
||||||
};
|
|
||||||
|
|
||||||
wam.code_repo.code.extend(module_code.into_iter());
|
wam.code_repo.code.extend(module_code.into_iter());
|
||||||
clause_code_generator.add_clause_code(wam);
|
clause_code_generator.add_clause_code(wam);
|
||||||
|
|||||||
Reference in New Issue
Block a user