error handling bugs in is/2 and =.., found by Paulo Moura.
This commit is contained in:
parent
b2caf2da77
commit
c13bf88377
3
C/eval.c
3
C/eval.c
@ -97,7 +97,6 @@ Eval(Term t USES_REGS)
|
||||
{
|
||||
|
||||
if (IsVarTerm(t)) {
|
||||
LOCAL_ArithError = TRUE;
|
||||
return Yap_ArithError(INSTANTIATION_ERROR,t,"in arithmetic");
|
||||
} else if (IsNumTerm(t)) {
|
||||
return t;
|
||||
@ -220,7 +219,7 @@ X is 2+3*4
|
||||
static Int
|
||||
p_is( USES_REGS1 )
|
||||
{ /* X is Y */
|
||||
Term out = 0L;
|
||||
Term out;
|
||||
yap_error_number err;
|
||||
|
||||
Term t = Deref(ARG2);
|
||||
|
15
C/stdpreds.c
15
C/stdpreds.c
@ -606,15 +606,28 @@ p_univ( USES_REGS1 )
|
||||
}
|
||||
if (IsNumTerm(twork)) {
|
||||
Term tt = TailOfTerm(t2);
|
||||
if (IsVarTerm(tt) || tt != MkAtomTerm(AtomNil)) {
|
||||
if (IsVarTerm(tt)) {
|
||||
Yap_Error(INSTANTIATION_ERROR, tt, "(=..)/2");
|
||||
return (FALSE);
|
||||
}
|
||||
if ( tt != MkAtomTerm(AtomNil)) {
|
||||
Yap_Error(TYPE_ERROR_ATOMIC, twork, "(=..)/2");
|
||||
return (FALSE);
|
||||
}
|
||||
return (Yap_unify_constant(ARG1, twork));
|
||||
}
|
||||
if (!IsAtomTerm(twork)) {
|
||||
Term tt = TailOfTerm(t2);
|
||||
if (IsVarTerm(tt)) {
|
||||
Yap_Error(INSTANTIATION_ERROR, twork, "(=..)/2");
|
||||
return(FALSE);
|
||||
} else if (tt == MkAtomTerm(AtomNil)) {
|
||||
Yap_Error(TYPE_ERROR_ATOMIC, twork, "(=..)/2");
|
||||
return (FALSE);
|
||||
} else {
|
||||
Yap_Error(TYPE_ERROR_ATOM, twork, "(=..)/2");
|
||||
return (FALSE);
|
||||
}
|
||||
}
|
||||
at = AtomOfTerm(twork);
|
||||
twork = TailOfTerm(t2);
|
||||
|
Reference in New Issue
Block a user