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,7 +569,8 @@ 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 == '.' -> throw(error(type_error(callable, H), clause/2))
|
||||||
; Name == (:), Arity =:= 2 ->
|
; Name == (:), Arity =:= 2 ->
|
||||||
arg(1, H, Module),
|
arg(1, H, Module),
|
||||||
arg(2, H, F),
|
arg(2, H, F),
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
@@ -880,7 +882,6 @@ 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())
|
||||||
@@ -896,20 +897,10 @@ impl ListingCompiler {
|
|||||||
|
|
||||||
(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)
|
||||||
|
|||||||
@@ -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