we don't need to wakeup variables that have no attributes, even if they have been bound.

This commit is contained in:
Vitor Santos Costa 2010-03-15 14:17:30 +00:00
parent 117647f552
commit 8b6b9e9ac3
3 changed files with 15 additions and 14 deletions

View File

@ -137,6 +137,10 @@ WakeAttVar(CELL* pt1, CELL reg2)
CELL *myH = H;
CELL *bind_ptr;
if (IsVarTerm(Deref(attv->Atts))) {
/* no attributes to wake */
return;
}
if (IsVarTerm(reg2)) {
if (pt1 == VarOfTerm(reg2))
return;

View File

@ -527,6 +527,8 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, int share, int cop
/* restore our nice, friendly, term to its original state */
HB = HB0;
clean_dirty_tr(TR0);
/* follow chain of multi-assigned variables */
close_attvar_chain(dvarsmin, dvarsmax);
return 0;
overflow:
@ -545,6 +547,7 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, int share, int cop
}
#endif
reset_trail(TR0);
reset_attvars(dvarsmin, dvarsmax);
return -1;
heap_overflow:
@ -563,6 +566,7 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, int share, int cop
}
#endif
reset_trail(TR0);
reset_attvars(dvarsmin, dvarsmax);
return -2;
trail_overflow:
@ -581,6 +585,7 @@ copy_complex_term(register CELL *pt0, register CELL *pt0_end, int share, int cop
}
#endif
reset_trail(TR0);
reset_attvars(dvarsmin, dvarsmax);
return -4;
}

View File

@ -307,20 +307,8 @@ copy_complex_term(CELL *pt0, CELL *pt0_end, int share, int newattvs, CELL *ptf,
/* restore our nice, friendly, term to its original state */
clean_dirty_tr(TR0);
/* follow chain of multi-assigned variables */
if (dvarsmin) {
dvarsmin += 1;
do {
CELL *newv;
Bind(dvarsmin+1, dvarsmin[1]);
if (IsUnboundVar(dvarsmin))
break;
newv = CellPtr(*dvarsmin);
RESET_VARIABLE(dvarsmin);
dvarsmin = newv;
} while (TRUE);
HB = HB0;
}
close_attvar_chain(dvarsmin, dvarsmax);
HB = HB0;
return ground;
overflow:
@ -339,6 +327,8 @@ copy_complex_term(CELL *pt0, CELL *pt0_end, int share, int newattvs, CELL *ptf,
}
#endif
reset_trail(TR0);
/* follow chain of multi-assigned variables */
reset_attvars(dvarsmin, dvarsmax);
return -1;
trail_overflow:
@ -359,6 +349,7 @@ trail_overflow:
{
tr_fr_ptr oTR = TR;
reset_trail(TR0);
reset_attvars(dvarsmin, dvarsmax);
if (!Yap_growtrail((oTR-TR0)*sizeof(tr_fr_ptr *), TRUE)) {
return -4;
}
@ -381,6 +372,7 @@ trail_overflow:
}
#endif
reset_trail(TR0);
reset_attvars(dvarsmin, dvarsmax);
Yap_Error_Size = (ADDR)AuxSp-(ADDR)to_visit0;
return -3;
}