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:
parent
b3d74b109a
commit
f331b192c3
116
C/utilpreds.c
116
C/utilpreds.c
@ -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
|
||||||
|
Reference in New Issue
Block a user