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