Another double trampoline removed.
This commit is contained in:
parent
38bb02aa61
commit
6ee81d304d
47
src/dotout.c
47
src/dotout.c
@ -930,6 +930,32 @@ termOccursInRun (Term t, int run)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//! Iterate over preceding bindings and check if term occurs there.
|
||||||
|
int
|
||||||
|
occurs_in_previous_binding (const System sys, const int run, const int ev,
|
||||||
|
const Term t)
|
||||||
|
{
|
||||||
|
List bl;
|
||||||
|
|
||||||
|
for (bl = sys->bindings; bl != NULL; bl = bl->next)
|
||||||
|
{
|
||||||
|
Binding b;
|
||||||
|
|
||||||
|
b = (Binding) bl->data;
|
||||||
|
if (isDependEvent (b->run_to, b->ev_to, run, ev))
|
||||||
|
{
|
||||||
|
if (isTermEqual (b->term, t))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//! Draw a class choice
|
//! Draw a class choice
|
||||||
/**
|
/**
|
||||||
* \rho classes are already dealt with in the headers, so we should ignore them.
|
* \rho classes are already dealt with in the headers, so we should ignore them.
|
||||||
@ -939,12 +965,6 @@ drawClass (const System sys, Binding b)
|
|||||||
{
|
{
|
||||||
Term varterm;
|
Term varterm;
|
||||||
|
|
||||||
// now check in previous things whether we saw that term already
|
|
||||||
int notSameTerm (Binding b2)
|
|
||||||
{
|
|
||||||
return (!isTermEqual (varterm, b2->term));
|
|
||||||
}
|
|
||||||
|
|
||||||
varterm = deVar (b->term);
|
varterm = deVar (b->term);
|
||||||
|
|
||||||
// Variable?
|
// Variable?
|
||||||
@ -968,15 +988,12 @@ drawClass (const System sys, Binding b)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Seen before?
|
// Seen before?
|
||||||
if (!iterate_preceding_bindings (b->run_to, b->ev_to, notSameTerm))
|
if (occurs_in_previous_binding (sys, b->run_to, b->ev_to, varterm))
|
||||||
{
|
{
|
||||||
// We saw the same term before. Exit.
|
// We saw the same term before. Exit.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// not seen before: choose class
|
// not seen before: choose class
|
||||||
eprintf ("\t");
|
eprintf ("\t");
|
||||||
chooseTermNode (varterm);
|
chooseTermNode (varterm);
|
||||||
@ -1092,15 +1109,9 @@ drawBinding (const System sys, Binding b)
|
|||||||
*/
|
*/
|
||||||
if (1 == 1 || sys->runs[b->run_from].role == I_M)
|
if (1 == 1 || sys->runs[b->run_from].role == I_M)
|
||||||
{
|
{
|
||||||
// now check in previous things whether we saw that term already
|
// now check in previous things whether we saw that term already, if so exit
|
||||||
int notSameTerm (Binding b2)
|
if (occurs_in_previous_binding (sys, b->run_to, b->ev_to, b->term))
|
||||||
{
|
{
|
||||||
return (!isTermEqual (b->term, b2->term));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!iterate_preceding_bindings (b->run_to, b->ev_to, notSameTerm))
|
|
||||||
{
|
|
||||||
// We saw the same term before. Exit.
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user