fix overflows in user utilities

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1273 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
vsc 2005-04-13 19:37:32 +00:00
parent b3d74b109a
commit f331b192c3

View File

@ -875,6 +875,9 @@ static Term non_singletons_in_complex_term(register CELL *pt0, register CELL *pt
vars_in_term_nvar:
{
if (IsPairTerm(d0)) {
if (to_visit + 1024 >= (CELL **)AuxSp) {
goto aux_overflow;
}
#ifdef RATIONAL_TREES
to_visit[0] = pt0;
to_visit[1] = pt0_end;
@ -901,6 +904,9 @@ static Term non_singletons_in_complex_term(register CELL *pt0, register CELL *pt
continue;
}
if (to_visit + 1024 >= (CELL **)AuxSp) {
goto aux_overflow;
}
#ifdef RATIONAL_TREES
to_visit[0] = pt0;
to_visit[1] = pt0_end;
@ -957,29 +963,49 @@ static Term non_singletons_in_complex_term(register CELL *pt0, register CELL *pt
/* close the list */
RESET_VARIABLE(H-1);
Yap_unify((CELL)(H-1),ARG2);
return(output);
return output;
} else {
return(ARG2);
return ARG2;
}
aux_overflow:
clean_tr(TR0);
if (H != InitialH) {
/* close the list */
RESET_VARIABLE(H-1);
}
return 0L;
}
static Int
p_non_singletons_in_term(void) /* non_singletons in term t */
{
Term t = Deref(ARG1);
Term out;
if (IsVarTerm(t)) {
out = MkPairTerm(t,ARG2);
} else if (IsPrimitiveTerm(t))
out = ARG2;
else if (IsPairTerm(t)) {
out = non_singletons_in_complex_term(RepPair(t)-1,
RepPair(t)+1);
}
else out = non_singletons_in_complex_term(RepAppl(t),
RepAppl(t)+
ArityOfFunctor(FunctorOfTerm(t)));
return(Yap_unify(ARG3,out));
Term t;
Term out;
while (TRUE) {
t = Deref(ARG1);
if (IsVarTerm(t)) {
out = MkPairTerm(t,ARG2);
} else if (IsPrimitiveTerm(t)) {
out = ARG2;
} else if (IsPairTerm(t)) {
out = non_singletons_in_complex_term(RepPair(t)-1,
RepPair(t)+1);
} else {
out = non_singletons_in_complex_term(RepAppl(t),
RepAppl(t)+
ArityOfFunctor(FunctorOfTerm(t)));
}
if (out != 0L) {
return Yap_unify(ARG3,out);
} else {
if (!Yap_ExpandPreAllocCodeSpace(0, NULL)) {
Yap_Error(OUT_OF_AUXSPACE_ERROR, ARG1, "overflow in singletons");
return FALSE;
}
}
}
}
static Int ground_complex_term(register CELL *pt0, register CELL *pt0_end)
@ -1000,6 +1026,9 @@ static Int ground_complex_term(register CELL *pt0, register CELL *pt0_end)
vars_in_term_nvar:
{
if (IsPairTerm(d0)) {
if (to_visit + 1024 >= (CELL **)AuxSp) {
goto aux_overflow;
}
#ifdef RATIONAL_TREES
to_visit[0] = pt0;
to_visit[1] = pt0_end;
@ -1025,6 +1054,9 @@ static Int ground_complex_term(register CELL *pt0, register CELL *pt0_end)
if (IsExtensionFunctor(f)) {
continue;
}
if (to_visit + 1024 >= (CELL **)AuxSp) {
goto aux_overflow;
}
#ifdef RATIONAL_TREES
to_visit[0] = pt0;
to_visit[1] = pt0_end;
@ -1072,29 +1104,47 @@ static Int ground_complex_term(register CELL *pt0, register CELL *pt0_end)
#endif
goto loop;
}
return(TRUE);
return TRUE;
aux_overflow:
return -1;
}
static Int
p_ground(void) /* ground(+T) */
{
Term t = Deref(ARG1);
Term t;
if (IsVarTerm(t)) {
return(FALSE);
} else if (IsPrimitiveTerm(t)) {
return(TRUE);
} else if (IsPairTerm(t)) {
return(ground_complex_term(RepPair(t)-1,
RepPair(t)+1));
} else {
Functor fun = FunctorOfTerm(t);
while (TRUE) {
Int out;
if (IsExtensionFunctor(fun))
return(TRUE);
else return(ground_complex_term(RepAppl(t),
RepAppl(t)+
ArityOfFunctor(fun)));
t = Deref(ARG1);
if (IsVarTerm(t)) {
return FALSE;
} else if (IsPrimitiveTerm(t)) {
return TRUE;
} else if (IsPairTerm(t)) {
if ((out =ground_complex_term(RepPair(t)-1,
RepPair(t)+1)) >= 0) {
return out;
}
} else {
Functor fun = FunctorOfTerm(t);
if (IsExtensionFunctor(fun))
return(TRUE);
else if ((out = ground_complex_term(RepAppl(t),
RepAppl(t)+
ArityOfFunctor(fun))) >= 0) {
return out;
}
}
if (out < 0) {
if (!Yap_ExpandPreAllocCodeSpace(0, NULL)) {
Yap_Error(OUT_OF_AUXSPACE_ERROR, ARG1, "overflow in ground");
return FALSE;
}
}
}
}
@ -1191,7 +1241,7 @@ static Int var_in_complex_term(register CELL *pt0,
goto loop;
}
clean_tr(TR0);
return(FALSE);
return FALSE;
}
static Int