1 - At RREMOVE also check the stack set aside for coercions.
2 - When coercions unexpectedly need stack of part of the stakpattern, discontinue this option.
This commit is contained in:
parent
c2a990768d
commit
cb0b2e08cf
1 changed files with 3 additions and 2 deletions
|
@ -392,14 +392,14 @@ if(Debug>1) fprintf(stderr,"Next tuple %d,%d,%d,%d\n",
|
||||||
ntup = tup->p_next;
|
ntup = tup->p_next;
|
||||||
for (i=0,t=0;i<nregneeded && t<mincost; i++)
|
for (i=0,t=0;i<nregneeded && t<mincost; i++)
|
||||||
t += docoerc(regtp[i],regcp[i],ply,FALSE,tup->p_rar[i]);
|
t += docoerc(regtp[i],regcp[i],ply,FALSE,tup->p_rar[i]);
|
||||||
if (t<mincost) {
|
if ( t<mincost && tokpatlen<=stackheight ) {
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
if (Debug>2)
|
if (Debug>2)
|
||||||
fprintf(stderr,"Continuing match after coercions\n");
|
fprintf(stderr,"Continuing match after coercions\n");
|
||||||
#endif
|
#endif
|
||||||
t += codegen(codep,ply,FALSE,mincost-t,0);
|
t += codegen(codep,ply,FALSE,mincost-t,0);
|
||||||
}
|
}
|
||||||
if (t<mincost) {
|
if ( t<mincost && tokpatlen<=stackheight ) {
|
||||||
mincost = t;
|
mincost = t;
|
||||||
besttup = tup;
|
besttup = tup;
|
||||||
} else
|
} else
|
||||||
|
@ -480,6 +480,7 @@ normalfailed: if (stackpad!=tokpatlen) {
|
||||||
result=compute(&enodes[nodeno]);
|
result=compute(&enodes[nodeno]);
|
||||||
if (result.e_typ!=EV_REG)
|
if (result.e_typ!=EV_REG)
|
||||||
break;
|
break;
|
||||||
|
if ( in_stack(result.e_v.e_reg) ) BROKE() ; /* Check aside-stack */
|
||||||
for (tp= &fakestack[stackheight-tokpatlen-1];tp>=&fakestack[0];tp--)
|
for (tp= &fakestack[stackheight-tokpatlen-1];tp>=&fakestack[0];tp--)
|
||||||
if (tp->t_token==-1) {
|
if (tp->t_token==-1) {
|
||||||
if(tp->t_att[0].ar==result.e_v.e_reg)
|
if(tp->t_att[0].ar==result.e_v.e_reg)
|
||||||
|
|
Loading…
Add table
Reference in a new issue