correct incremental compilation bugs
This commit is contained in:
@@ -812,8 +812,9 @@ impl PredicateInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub(crate) fn must_retract_local_clauses(&self) -> bool {
|
pub(crate) fn must_retract_local_clauses(&self, is_cross_module_clause: bool) -> bool {
|
||||||
self.is_extensible && self.has_clauses && !self.is_discontiguous
|
self.is_extensible && self.has_clauses && !self.is_discontiguous &&
|
||||||
|
!(self.is_multifile && is_cross_module_clause)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2280,14 +2280,17 @@ impl<'a, LS: LoadState<'a>> Loader<'a, LS> {
|
|||||||
.ok_or(SessionError::NamelessEntry)?;
|
.ok_or(SessionError::NamelessEntry)?;
|
||||||
|
|
||||||
let listing_src_file_name = self.listing_src_file_name();
|
let listing_src_file_name = self.listing_src_file_name();
|
||||||
let payload_compilation_target = self.payload.compilation_target;
|
|
||||||
|
|
||||||
let mut predicate_info = self
|
// payload_compilation_target describes the compilation context,
|
||||||
.wam_prelude
|
// e.g. compiling
|
||||||
.indices
|
//
|
||||||
.get_predicate_skeleton(&self.payload.predicates.compilation_target, &key)
|
// table_wrapper:tabled(get_node(A), b).
|
||||||
.map(|skeleton| skeleton.predicate_info())
|
//
|
||||||
.unwrap_or_default();
|
// without a module declaration means self.payload.compilation_target
|
||||||
|
// is CompilationTarget::User while self.payload.predicates.compilation_target
|
||||||
|
// is CompilationTarget::Module(atom!("table_wrapper")).
|
||||||
|
|
||||||
|
let payload_compilation_target = self.payload.compilation_target;
|
||||||
|
|
||||||
let local_predicate_info = self
|
let local_predicate_info = self
|
||||||
.wam_prelude
|
.wam_prelude
|
||||||
@@ -2301,34 +2304,37 @@ impl<'a, LS: LoadState<'a>> Loader<'a, LS> {
|
|||||||
.map(|skeleton| skeleton.predicate_info())
|
.map(|skeleton| skeleton.predicate_info())
|
||||||
.unwrap_or_default();
|
.unwrap_or_default();
|
||||||
|
|
||||||
if local_predicate_info.must_retract_local_clauses() {
|
let mut predicate_info = self
|
||||||
|
.wam_prelude
|
||||||
|
.indices
|
||||||
|
.get_predicate_skeleton(&self.payload.predicates.compilation_target, &key)
|
||||||
|
.map(|skeleton| skeleton.predicate_info())
|
||||||
|
.unwrap_or_default();
|
||||||
|
|
||||||
|
let is_cross_module_clause =
|
||||||
|
payload_compilation_target != self.payload.predicates.compilation_target;
|
||||||
|
|
||||||
|
if local_predicate_info.must_retract_local_clauses(is_cross_module_clause) {
|
||||||
self.retract_local_clauses(&key, predicate_info.is_dynamic);
|
self.retract_local_clauses(&key, predicate_info.is_dynamic);
|
||||||
}
|
}
|
||||||
|
|
||||||
let do_incremental_compile =
|
|
||||||
if payload_compilation_target == self.payload.predicates.compilation_target {
|
|
||||||
predicate_info.compile_incrementally()
|
|
||||||
} else {
|
|
||||||
local_predicate_info.is_multifile && predicate_info.compile_incrementally()
|
|
||||||
};
|
|
||||||
|
|
||||||
let predicates_len = self.payload.predicates.len();
|
let predicates_len = self.payload.predicates.len();
|
||||||
let non_counted_bt = self.payload.non_counted_bt_preds.contains(&key);
|
let non_counted_bt = self.payload.non_counted_bt_preds.contains(&key);
|
||||||
|
|
||||||
if do_incremental_compile {
|
if predicate_info.compile_incrementally() {
|
||||||
let predicates = self.payload.predicates.take();
|
let predicates = self.payload.predicates.take();
|
||||||
|
|
||||||
for term in predicates.predicates {
|
for term in predicates.predicates {
|
||||||
self.incremental_compile_clause(
|
self.incremental_compile_clause(
|
||||||
key,
|
key,
|
||||||
term,
|
term,
|
||||||
payload_compilation_target,
|
self.payload.predicates.compilation_target,
|
||||||
non_counted_bt,
|
non_counted_bt,
|
||||||
AppendOrPrepend::Append,
|
AppendOrPrepend::Append,
|
||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if payload_compilation_target != self.payload.predicates.compilation_target {
|
if is_cross_module_clause {
|
||||||
if !local_predicate_info.is_extensible {
|
if !local_predicate_info.is_extensible {
|
||||||
if predicate_info.is_multifile {
|
if predicate_info.is_multifile {
|
||||||
println!(
|
println!(
|
||||||
@@ -2343,9 +2349,11 @@ impl<'a, LS: LoadState<'a>> Loader<'a, LS> {
|
|||||||
.indices
|
.indices
|
||||||
.remove_predicate_skeleton(&self.payload.predicates.compilation_target, &key)
|
.remove_predicate_skeleton(&self.payload.predicates.compilation_target, &key)
|
||||||
{
|
{
|
||||||
|
let compilation_target = self.payload.predicates.compilation_target;
|
||||||
|
|
||||||
if predicate_info.is_dynamic {
|
if predicate_info.is_dynamic {
|
||||||
let clause_clause_compilation_target =
|
let clause_clause_compilation_target =
|
||||||
match self.payload.predicates.compilation_target {
|
match compilation_target {
|
||||||
CompilationTarget::User => {
|
CompilationTarget::User => {
|
||||||
CompilationTarget::Module(atom!("builtins"))
|
CompilationTarget::Module(atom!("builtins"))
|
||||||
}
|
}
|
||||||
@@ -2364,7 +2372,7 @@ impl<'a, LS: LoadState<'a>> Loader<'a, LS> {
|
|||||||
|
|
||||||
self.payload.retraction_info.push_record(
|
self.payload.retraction_info.push_record(
|
||||||
RetractionRecord::RemovedSkeleton(
|
RetractionRecord::RemovedSkeleton(
|
||||||
payload_compilation_target,
|
compilation_target,
|
||||||
key,
|
key,
|
||||||
skeleton,
|
skeleton,
|
||||||
),
|
),
|
||||||
@@ -2415,9 +2423,11 @@ impl<'a, LS: LoadState<'a>> Loader<'a, LS> {
|
|||||||
.clause_clauses.drain(0..std::cmp::min(predicates_len, clause_clauses_len))
|
.clause_clauses.drain(0..std::cmp::min(predicates_len, clause_clauses_len))
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
|
let compilation_target = self.payload.predicates.compilation_target;
|
||||||
|
|
||||||
self.compile_clause_clauses(
|
self.compile_clause_clauses(
|
||||||
key,
|
key,
|
||||||
payload_compilation_target,
|
compilation_target,
|
||||||
clauses_vec.into_iter(),
|
clauses_vec.into_iter(),
|
||||||
AppendOrPrepend::Append,
|
AppendOrPrepend::Append,
|
||||||
)?;
|
)?;
|
||||||
|
|||||||
Reference in New Issue
Block a user