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;
if (IsVarTerm(t)) {
out = MkPairTerm(t,ARG2); while (TRUE) {
} else if (IsPrimitiveTerm(t)) t = Deref(ARG1);
out = ARG2; if (IsVarTerm(t)) {
else if (IsPairTerm(t)) { out = MkPairTerm(t,ARG2);
out = non_singletons_in_complex_term(RepPair(t)-1, } else if (IsPrimitiveTerm(t)) {
RepPair(t)+1); out = ARG2;
} } else if (IsPairTerm(t)) {
else out = non_singletons_in_complex_term(RepAppl(t), out = non_singletons_in_complex_term(RepPair(t)-1,
RepAppl(t)+ RepPair(t)+1);
ArityOfFunctor(FunctorOfTerm(t))); } else {
return(Yap_unify(ARG3,out)); 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) 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;
if (IsVarTerm(t)) { while (TRUE) {
return(FALSE); Int out;
} 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);
if (IsExtensionFunctor(fun)) t = Deref(ARG1);
return(TRUE); if (IsVarTerm(t)) {
else return(ground_complex_term(RepAppl(t), return FALSE;
RepAppl(t)+ } else if (IsPrimitiveTerm(t)) {
ArityOfFunctor(fun))); 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; goto loop;
} }
clean_tr(TR0); clean_tr(TR0);
return(FALSE); return FALSE;
} }
static Int static Int