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

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

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