fix 'drain lower bound was too large', store user-level expansions to modules (#416)

This commit is contained in:
Mark Thom
2020-04-30 00:01:00 -06:00
parent dd4832e40b
commit e0e52a3090
6 changed files with 46 additions and 43 deletions

View File

@@ -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,
}, },

View File

@@ -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),

View File

@@ -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)

View File

@@ -307,6 +307,12 @@ impl Machine {
} }
} }
} }
Addr::Usize(n) => {
n
}
Addr::Fixnum(n) => {
usize::try_from(n).unwrap()
}
_ => { _ => {
unreachable!() unreachable!()
} }

View File

@@ -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());
} }

View File

@@ -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))
} }