fix incremental compilation and multifile bugs
This commit is contained in:
@@ -103,12 +103,28 @@ fn lower_bound_of_target_clause(skeleton: &PredicateSkeleton, target_pos: usize)
|
||||
return target_pos - 1;
|
||||
}
|
||||
|
||||
for index in (0..target_pos - 1).rev() {
|
||||
let mut index_loc_opt = None;
|
||||
|
||||
for index in (0..target_pos).rev() {
|
||||
let current_arg_num = skeleton.clauses[index].opt_arg_index_key.arg_num();
|
||||
|
||||
if current_arg_num == 0 || current_arg_num != arg_num {
|
||||
return index + 1;
|
||||
}
|
||||
|
||||
if let Some(index_loc) = index_loc_opt {
|
||||
let current_index_loc = skeleton.clauses[index]
|
||||
.opt_arg_index_key
|
||||
.switch_on_term_loc();
|
||||
|
||||
if Some(index_loc) != current_index_loc {
|
||||
return index + 1;
|
||||
}
|
||||
} else {
|
||||
index_loc_opt = skeleton.clauses[index]
|
||||
.opt_arg_index_key
|
||||
.switch_on_term_loc();
|
||||
}
|
||||
}
|
||||
|
||||
0
|
||||
@@ -1195,7 +1211,7 @@ fn append_compiled_clause(
|
||||
retraction_info,
|
||||
);
|
||||
|
||||
if lower_bound == 0 {
|
||||
if lower_bound == 0 && !skeleton.core.is_dynamic {
|
||||
code_ptr_opt = Some(target_pos_clause_start);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -461,13 +461,21 @@ impl<'a> LoadState<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
pub(super) fn remove_replaced_module(&mut self, module_name: ClauseName) {
|
||||
pub(super) fn remove_replaced_in_situ_module(&mut self, module_name: ClauseName) {
|
||||
let removed_module = match self.wam.indices.modules.remove(&module_name) {
|
||||
Some(module) => module,
|
||||
None => return,
|
||||
};
|
||||
|
||||
for (key, code_index) in &removed_module.code_dir {
|
||||
match removed_module
|
||||
.local_extensible_predicates
|
||||
.get(&(CompilationTarget::User, key.clone()))
|
||||
{
|
||||
Some(skeleton) if skeleton.is_multifile => continue,
|
||||
_ => {}
|
||||
}
|
||||
|
||||
if code_index.get() != IndexPtr::Undefined {
|
||||
let old_index_ptr = code_index.replace(IndexPtr::Undefined);
|
||||
|
||||
@@ -919,7 +927,7 @@ impl<'a> LoadState<'a> {
|
||||
let module_name = module_decl.name.clone();
|
||||
|
||||
self.remove_module_exports(module_name.clone());
|
||||
self.remove_replaced_module(module_name.clone());
|
||||
self.remove_replaced_in_situ_module(module_name.clone());
|
||||
|
||||
match self.wam.indices.modules.get_mut(&module_name) {
|
||||
Some(module) => {
|
||||
|
||||
Reference in New Issue
Block a user