@@ -561,8 +561,9 @@ assertz(Clause) :-
|
|||||||
).
|
).
|
||||||
|
|
||||||
first_match_index([Clause0 | Clauses], Clause1, N0, N) :-
|
first_match_index([Clause0 | Clauses], Clause1, N0, N) :-
|
||||||
( Clause0 \= Clause1 -> N1 is N0 + 1,
|
( Clause0 \= Clause1 ->
|
||||||
first_match_index(Clauses, Clause1, N1, N)
|
N1 is N0 + 1,
|
||||||
|
first_match_index(Clauses, Clause1, N1, N)
|
||||||
; N0 = N, Clause0 = Clause1
|
; N0 = N, Clause0 = Clause1
|
||||||
).
|
).
|
||||||
|
|
||||||
|
|||||||
@@ -277,34 +277,6 @@ pub fn compile_term(wam: &mut Machine, packet: TopLevelPacket) -> EvalSession {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_module_indices(wam: &mut Machine, module_name: ClauseName, mut indices: IndexStore) {
|
|
||||||
match wam.indices.modules.get_mut(&module_name) {
|
|
||||||
Some(ref mut module) => {
|
|
||||||
let 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() {
|
|
||||||
let p = idx.0.borrow().0;
|
|
||||||
|
|
||||||
let idx = CodeIndex::dynamic_undefined(module_name.clone());
|
|
||||||
let idx = module.code_dir.entry(key.clone()).or_insert(idx);
|
|
||||||
|
|
||||||
set_code_index!(idx, p, module_name.clone());
|
|
||||||
|
|
||||||
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!(),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
fn add_hooks_to_mockup(
|
fn add_hooks_to_mockup(
|
||||||
code_repo: &mut CodeRepo,
|
code_repo: &mut CodeRepo,
|
||||||
hook: CompileTimeHook,
|
hook: CompileTimeHook,
|
||||||
@@ -320,25 +292,21 @@ fn add_hooks_to_mockup(
|
|||||||
preds.1.extend(expansions.1.into_iter());
|
preds.1.extend(expansions.1.into_iter());
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup_module_expansions(wam: &mut Machine, module_name: ClauseName) {
|
fn setup_module_expansions(wam: &mut Machine, module: &Module) {
|
||||||
match wam.indices.modules.get(&module_name) {
|
let term_expansions = module.term_expansions.clone();
|
||||||
Some(module) => {
|
let goal_expansions = module.goal_expansions.clone();
|
||||||
let term_expansions = module.term_expansions.clone();
|
|
||||||
let goal_expansions = module.goal_expansions.clone();
|
|
||||||
|
|
||||||
add_hooks_to_mockup(
|
add_hooks_to_mockup(
|
||||||
&mut wam.code_repo,
|
&mut wam.code_repo,
|
||||||
CompileTimeHook::TermExpansion,
|
CompileTimeHook::TermExpansion,
|
||||||
term_expansions,
|
term_expansions,
|
||||||
);
|
);
|
||||||
add_hooks_to_mockup(
|
|
||||||
&mut wam.code_repo,
|
add_hooks_to_mockup(
|
||||||
CompileTimeHook::GoalExpansion,
|
&mut wam.code_repo,
|
||||||
goal_expansions,
|
CompileTimeHook::GoalExpansion,
|
||||||
);
|
goal_expansions,
|
||||||
}
|
);
|
||||||
_ => unreachable!(),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn compile_into_module<R: Read>(
|
pub(super) fn compile_into_module<R: Read>(
|
||||||
@@ -348,13 +316,21 @@ pub(super) fn compile_into_module<R: Read>(
|
|||||||
name: ClauseName,
|
name: ClauseName,
|
||||||
) -> EvalSession {
|
) -> 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, module_name.clone(), &mut indices));
|
let module = wam.indices.take_module(module_name.clone()).unwrap();
|
||||||
|
|
||||||
|
indices.code_dir = module.code_dir.clone();
|
||||||
|
indices.op_dir = module.op_dir.clone();
|
||||||
|
indices.atom_tbl = module.atom_tbl.clone();
|
||||||
|
|
||||||
let mut compiler = ListingCompiler::new(&wam.code_repo, true, module_name.clone());
|
let mut compiler = ListingCompiler::new(&wam.code_repo, true, module_name.clone());
|
||||||
|
|
||||||
match compile_into_module_impl(wam, &mut compiler, module_name, src, indices) {
|
match compile_into_module_impl(wam, &mut compiler, module, src, indices) {
|
||||||
Ok(()) => EvalSession::EntrySuccess,
|
Ok(()) => EvalSession::EntrySuccess,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
if let Some(module) = compiler.module.take() {
|
||||||
|
wam.indices.insert_module(module);
|
||||||
|
}
|
||||||
|
|
||||||
compiler.drop_expansions(wam.machine_flags(), &mut wam.code_repo);
|
compiler.drop_expansions(wam.machine_flags(), &mut wam.code_repo);
|
||||||
EvalSession::from(e)
|
EvalSession::from(e)
|
||||||
}
|
}
|
||||||
@@ -364,29 +340,28 @@ pub(super) fn compile_into_module<R: Read>(
|
|||||||
fn compile_into_module_impl<R: Read>(
|
fn compile_into_module_impl<R: Read>(
|
||||||
wam: &mut Machine,
|
wam: &mut Machine,
|
||||||
compiler: &mut ListingCompiler,
|
compiler: &mut ListingCompiler,
|
||||||
module_name: ClauseName,
|
module: Module,
|
||||||
src: ParsingStream<R>,
|
src: ParsingStream<R>,
|
||||||
mut indices: IndexStore,
|
mut indices: IndexStore,
|
||||||
) -> Result<(), SessionError> {
|
) -> Result<(), SessionError> {
|
||||||
setup_module_expansions(wam, module_name.clone());
|
setup_module_expansions(wam, &module);
|
||||||
|
|
||||||
let flags = wam.machine_flags();
|
let module_name = module.module_decl.name.clone();
|
||||||
|
compiler.module = Some(module);
|
||||||
|
|
||||||
wam.code_repo
|
let flags = wam.machine_flags();
|
||||||
.compile_hook(CompileTimeHook::TermExpansion, flags)?;
|
|
||||||
wam.code_repo
|
wam.code_repo.compile_hook(CompileTimeHook::TermExpansion, flags)?;
|
||||||
.compile_hook(CompileTimeHook::GoalExpansion, flags)?;
|
wam.code_repo.compile_hook(CompileTimeHook::GoalExpansion, flags)?;
|
||||||
|
|
||||||
let results = compiler.gather_items(wam, src, &mut indices)?;
|
let results = compiler.gather_items(wam, src, &mut indices)?;
|
||||||
let module_code =
|
let module_code =
|
||||||
compiler.generate_code(results.worker_results, wam, &mut indices.code_dir, 0)?;
|
compiler.generate_code(results.worker_results, wam, &mut indices.code_dir, 0)?;
|
||||||
|
|
||||||
let mut clause_code_generator = ClauseCodeGenerator::new(module_code.len(), module_name.clone());
|
let mut clause_code_generator = ClauseCodeGenerator::new(module_code.len(), module_name.clone());
|
||||||
clause_code_generator.generate_clause_code(&results.dynamic_clause_map, wam)?;
|
|
||||||
|
|
||||||
update_module_indices(wam, module_name, indices);
|
clause_code_generator.generate_clause_code(&results.dynamic_clause_map, wam)?;
|
||||||
|
add_module_code(wam, compiler.module.take().unwrap(), module_code, indices);
|
||||||
wam.code_repo.code.extend(module_code.into_iter());
|
|
||||||
clause_code_generator.add_clause_code(wam, results.dynamic_clause_map);
|
clause_code_generator.add_clause_code(wam, results.dynamic_clause_map);
|
||||||
|
|
||||||
Ok(compiler.drop_expansions(wam.machine_flags(), &mut wam.code_repo))
|
Ok(compiler.drop_expansions(wam.machine_flags(), &mut wam.code_repo))
|
||||||
@@ -507,20 +482,9 @@ fn add_toplevel_code(wam: &mut Machine, code: Code, indices: IndexStore) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn add_module_code(wam: &mut Machine, mut module: Module, code: Code, mut indices: IndexStore) {
|
fn add_module_code(wam: &mut Machine, mut module: Module, code: Code, indices: IndexStore) {
|
||||||
let code_dir = mem::replace(&mut indices.code_dir, CodeDir::new());
|
module.code_dir.extend(indices.code_dir);
|
||||||
let op_dir = mem::replace(&mut indices.op_dir, OpDir::new());
|
module.op_dir.extend(indices.op_dir.into_iter());
|
||||||
|
|
||||||
module.code_dir.extend(code_dir);
|
|
||||||
module.op_dir.extend(op_dir.into_iter());
|
|
||||||
|
|
||||||
for (name, arity) in indices.code_dir.keys().cloned() {
|
|
||||||
if name.owning_module() == module.module_decl.name {
|
|
||||||
wam.indices
|
|
||||||
.dynamic_code_dir
|
|
||||||
.swap_remove(&(name.owning_module(), name, arity));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wam.add_module(module, code);
|
wam.add_module(module, code);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user