fix 'drain lower bound was too large', store user-level expansions to modules (#416)
This commit is contained in:
@@ -343,7 +343,9 @@ impl<'a, TermMarker: Allocator<'a>> CodeGenerator<TermMarker> {
|
|||||||
&mut ControlInstruction::CallClause(_, _, _, ref mut last_call, _) => {
|
&mut ControlInstruction::CallClause(_, _, _, ref mut last_call, _) => {
|
||||||
*last_call = true
|
*last_call = true
|
||||||
}
|
}
|
||||||
&mut ControlInstruction::JmpBy(_, _, _, ref mut last_call) => *last_call = true,
|
&mut ControlInstruction::JmpBy(_, _, _, ref mut last_call) => {
|
||||||
|
*last_call = true
|
||||||
|
}
|
||||||
&mut ControlInstruction::Proceed => {}
|
&mut ControlInstruction::Proceed => {}
|
||||||
_ => dealloc_index += 1,
|
_ => dealloc_index += 1,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -569,18 +569,19 @@ setof(Template, Goal, Solution) :-
|
|||||||
|
|
||||||
clause(H, B) :-
|
clause(H, B) :-
|
||||||
( var(H) -> throw(error(instantiation_error, clause/2))
|
( var(H) -> throw(error(instantiation_error, clause/2))
|
||||||
; functor(H, Name, Arity) -> ( Name == '.' -> throw(error(type_error(callable, H), clause/2))
|
; functor(H, Name, Arity) ->
|
||||||
; Name == (:), Arity =:= 2 ->
|
( Name == '.' -> throw(error(type_error(callable, H), clause/2))
|
||||||
arg(1, H, Module),
|
; Name == (:), Arity =:= 2 ->
|
||||||
arg(2, H, F),
|
arg(1, H, Module),
|
||||||
'$module_clause'(F, B, Module)
|
arg(2, H, F),
|
||||||
%% '$no_such_predicate' fails if H is not callable.
|
'$module_clause'(F, B, Module)
|
||||||
; '$no_such_predicate'(H) -> '$fail'
|
%% '$no_such_predicate' fails if H is not callable.
|
||||||
; '$head_is_dynamic'(H) -> '$clause_body_is_valid'(B),
|
; '$no_such_predicate'(H) -> '$fail'
|
||||||
'$get_clause'(H, B)
|
; '$head_is_dynamic'(H) -> '$clause_body_is_valid'(B),
|
||||||
; throw(error(permission_error(access, private_procedure, Name/Arity),
|
'$get_clause'(H, B)
|
||||||
clause/2))
|
; throw(error(permission_error(access, private_procedure, Name/Arity),
|
||||||
)
|
clause/2))
|
||||||
|
)
|
||||||
; throw(error(type_error(callable, H), clause/2))
|
; throw(error(type_error(callable, H), clause/2))
|
||||||
).
|
).
|
||||||
|
|
||||||
|
|||||||
@@ -188,6 +188,8 @@ fn set_first_index(code: &mut Code) {
|
|||||||
if *offset == 0 =>
|
if *offset == 0 =>
|
||||||
{
|
{
|
||||||
*offset = code_len - idx;
|
*offset = code_len - idx;
|
||||||
|
debug_assert!(*offset > 0);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
@@ -634,7 +636,7 @@ impl ListingCompiler {
|
|||||||
.term_dir_entry_len((clause_name!("term_expansion"), 2)),
|
.term_dir_entry_len((clause_name!("term_expansion"), 2)),
|
||||||
orig_goal_expansion_lens: code_repo
|
orig_goal_expansion_lens: code_repo
|
||||||
.term_dir_entry_len((clause_name!("goal_expansion"), 2)),
|
.term_dir_entry_len((clause_name!("goal_expansion"), 2)),
|
||||||
initialization_goals: (vec![], VecDeque::from(vec![])),
|
initialization_goals: (vec![], VecDeque::from(vec![])),
|
||||||
suppress_warnings,
|
suppress_warnings,
|
||||||
listing_src
|
listing_src
|
||||||
}
|
}
|
||||||
@@ -880,36 +882,25 @@ impl ListingCompiler {
|
|||||||
|
|
||||||
let (mut len, mut queue_len) = ((preds.0).0.len(), preds.1.len());
|
let (mut len, mut queue_len) = ((preds.0).0.len(), preds.1.len());
|
||||||
|
|
||||||
if self.module.is_some() && hook.has_module_scope() {
|
let module_preds = self
|
||||||
let module_preds = self
|
.user_term_dir
|
||||||
.user_term_dir
|
.entry(key.clone())
|
||||||
.entry(key.clone())
|
.or_insert((Predicate::new(), VecDeque::from(vec![])));
|
||||||
.or_insert((Predicate::new(), VecDeque::from(vec![])));
|
|
||||||
|
|
||||||
if let Some(ref mut module) = &mut self.module {
|
if let Some(ref mut module) = &mut self.module {
|
||||||
module.add_expansion_record(hook, clause.clone(), queue.clone());
|
module.add_expansion_record(hook, clause.clone(), queue.clone());
|
||||||
module.add_local_expansion(hook, clause.clone(), queue.clone());
|
module.add_local_expansion(hook, clause.clone(), queue.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
(module_preds.0).0.push(clause);
|
(module_preds.0).0.push(clause);
|
||||||
module_preds.1.extend(queue.into_iter());
|
module_preds.1.extend(queue.into_iter());
|
||||||
|
|
||||||
(preds.0).0.extend((module_preds.0).0.iter().cloned());
|
(preds.0).0.extend((module_preds.0).0.iter().cloned());
|
||||||
preds.1.extend(module_preds.1.iter().cloned());
|
preds.1.extend(module_preds.1.iter().cloned());
|
||||||
} else {
|
|
||||||
let module_preds = self
|
|
||||||
.user_term_dir
|
|
||||||
.entry(key.clone())
|
|
||||||
.or_insert((Predicate::new(), VecDeque::from(vec![])));
|
|
||||||
|
|
||||||
|
if !(self.module.is_some() && hook.has_module_scope()) {
|
||||||
len += 1;
|
len += 1;
|
||||||
queue_len += queue_len;
|
queue_len += queue_len;
|
||||||
|
|
||||||
(preds.0).0.push(clause);
|
|
||||||
preds.1.extend(queue.into_iter());
|
|
||||||
|
|
||||||
(preds.0).0.extend((module_preds.0).0.iter().cloned());
|
|
||||||
preds.1.extend(module_preds.1.iter().cloned());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
(len, queue_len)
|
(len, queue_len)
|
||||||
@@ -980,12 +971,12 @@ impl ListingCompiler {
|
|||||||
Err(SessionError::from(ParserError::InvalidModuleDecl))
|
Err(SessionError::from(ParserError::InvalidModuleDecl))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Declaration::ModuleInitialization(query_terms, queue) => {
|
Declaration::ModuleInitialization(query_terms, queue) => {
|
||||||
self.initialization_goals.0.extend(query_terms.into_iter());
|
self.initialization_goals.0.extend(query_terms.into_iter());
|
||||||
self.initialization_goals.1.extend(queue.into_iter());
|
self.initialization_goals.1.extend(queue.into_iter());
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
Declaration::MultiFile(..) => {
|
Declaration::MultiFile(..) => {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -307,6 +307,12 @@ impl Machine {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Addr::Usize(n) => {
|
||||||
|
n
|
||||||
|
}
|
||||||
|
Addr::Fixnum(n) => {
|
||||||
|
usize::try_from(n).unwrap()
|
||||||
|
}
|
||||||
_ => {
|
_ => {
|
||||||
unreachable!()
|
unreachable!()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ impl Module {
|
|||||||
(te.0)
|
(te.0)
|
||||||
.0
|
.0
|
||||||
.extend((self.user_term_expansions.0).0.iter().cloned());
|
.extend((self.user_term_expansions.0).0.iter().cloned());
|
||||||
|
|
||||||
te.1.extend(self.user_term_expansions.1.iter().cloned());
|
te.1.extend(self.user_term_expansions.1.iter().cloned());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,6 +61,7 @@ impl Module {
|
|||||||
(ge.0)
|
(ge.0)
|
||||||
.0
|
.0
|
||||||
.extend((self.user_goal_expansions.0).0.iter().cloned());
|
.extend((self.user_goal_expansions.0).0.iter().cloned());
|
||||||
|
|
||||||
ge.1.extend(self.user_goal_expansions.1.iter().cloned());
|
ge.1.extend(self.user_goal_expansions.1.iter().cloned());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -872,6 +872,7 @@ impl RelationWorker {
|
|||||||
let term = Term::Clause(Cell::default(), clause_name!(";"), terms, None);
|
let term = Term::Clause(Cell::default(), clause_name!(";"), terms, None);
|
||||||
let (stub, clauses) = self.fabricate_disjunct(term);
|
let (stub, clauses) = self.fabricate_disjunct(term);
|
||||||
|
|
||||||
|
debug_assert!(clauses.len() > 0);
|
||||||
self.queue.push_back(clauses);
|
self.queue.push_back(clauses);
|
||||||
Ok(QueryTerm::Jump(stub))
|
Ok(QueryTerm::Jump(stub))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user