Skip to content

Commit

Permalink
discard CodeIndex literals from unfolded control operators in preproc…
Browse files Browse the repository at this point in the history
…essor (#1791)
  • Loading branch information
mthom committed Apr 22, 2023
1 parent 58a8fa9 commit e1258a5
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 3 deletions.
6 changes: 3 additions & 3 deletions src/machine/preprocessor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -399,7 +399,7 @@ fn check_for_internal_if_then(terms: &mut Vec<Term>) {
}

if let Some(Term::Clause(_, name, ref subterms)) = terms.last() {
if *name != atom!("->") || subterms.len() != 2 {
if *name != atom!("->") || source_arity(subterms) != 2 {
return;
}
} else {
Expand Down Expand Up @@ -770,7 +770,7 @@ impl Preprocessor {
Term::Var(_, ref v) if v.as_str() == "!" => {
Ok(QueryTerm::UnblockedCut(Cell::default()))
}
Term::Clause(r, name, mut terms) => match (name, terms.len()) {
Term::Clause(r, name, mut terms) => match (name, source_arity(&terms)) {
(atom!(";"), 2) => {
let term = Term::Clause(r, name, terms);

Expand Down Expand Up @@ -900,7 +900,7 @@ impl Preprocessor {
let mut term = term;

if let Term::Clause(cell, name, terms) = term {
if name == atom!(",") && terms.len() == 2 {
if name == atom!(",") && source_arity(&terms) == 2 {
let term = Term::Clause(cell, name, terms);
let mut subterms = unfold_by_str(term, atom!(","));

Expand Down
17 changes: 17 additions & 0 deletions src/parser/ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -626,8 +626,25 @@ impl Term {
}
}

#[inline]
pub fn source_arity(terms: &[Term]) -> usize {
if let Some(last_arg) = terms.last() {
if let Term::Literal(_, Literal::CodeIndex(_)) = last_arg {
return terms.len() - 1;
}
}

terms.len()
}

fn unfold_by_str_once(term: &mut Term, s: Atom) -> Option<(Term, Term)> {
if let Term::Clause(_, ref name, ref mut subterms) = term {
if let Some(last_arg) = subterms.last() {
if let Term::Literal(_, Literal::CodeIndex(_)) = last_arg {
subterms.pop();
}
}

if name == &s && subterms.len() == 2 {
let snd = subterms.pop().unwrap();
let fst = subterms.pop().unwrap();
Expand Down

0 comments on commit e1258a5

Please sign in to comment.