more fixes for bignum support in PLStream.

This commit is contained in:
ubu32 2011-02-27 03:40:27 -08:00
parent 3c261305db
commit f2e8f2ac2e
4 changed files with 72 additions and 2 deletions

View File

@ -535,6 +535,9 @@ X_API int PL_get_name_arity(term_t ts, atom_t *name, int *arity)
}
if (YAP_IsApplTerm(t)) {
Functor f = FunctorOfTerm(t);
if (IsExtensionFunctor(f)) {
return 0;
}
*name = AtomToSWIAtom(NameOfFunctor(f));
*arity = ArityOfFunctor(f);
return 1;
@ -1697,7 +1700,18 @@ X_API int PL_is_float(term_t ts)
X_API int PL_is_integer(term_t ts)
{
YAP_Term t = Yap_GetFromSlot(ts);
return YAP_IsIntTerm(t) || YAP_IsBigNumTerm(t);
if (IsVarTerm(t)) return FALSE;
if (IsIntTerm(t)) return TRUE;
if (IsApplTerm(t)) {
Functor f = FunctorOfTerm(t);
if (f == FunctorLongInt)
return TRUE;
if (f == FunctorBigInt) {
CELL mask = RepAppl(t)[1];
return ( mask == BIG_INT );
}
}
return FALSE;
}
X_API int PL_is_list(term_t ts)
@ -2841,6 +2855,52 @@ FILE *Yap_FileDescriptorFromStream(Term t)
return NULL;
}
extern term_t Yap_CvtTerm(term_t ts);
term_t Yap_CvtTerm(term_t ts)
{
Term t = Yap_GetFromSlot(ts);
if (IsVarTerm(t)) return ts;
if (IsPairTerm(t)) return ts;
if (IsAtomTerm(t)) return ts;
if (IsIntTerm(t)) return ts;
if (IsApplTerm(t)) {
Functor f = FunctorOfTerm(t);
if (IsExtensionFunctor(f)) {
if (f == FunctorBigInt) {
big_blob_type flag = RepAppl(t)[1];
switch (flag) {
case BIG_INT:
return ts;
case BIG_RATIONAL:
#if USE_GMP
{
MP_RAT *b = Yap_BigRatOfTerm(t);
Term ta[2];
ta[0] = Yap_MkBigIntTerm(mpq_numref(b));
if (ta[0] == TermNil)
return ts;
ta[1] = Yap_MkBigIntTerm(mpq_denref(b));
if (ta[1] == TermNil)
return ts;
return Yap_InitSlot(Yap_MkApplTerm(FunctorRDiv, 2, ta));
}
#endif
case EMPTY_ARENA:
case ARRAY_INT:
case ARRAY_FLOAT:
case CLAUSE_LIST:
case EXTERNAL_BLOB:
return Yap_InitSlot(MkIntTerm(0));
default:
return ts;
}
}
}
}
return ts;
}
#ifdef _WIN32
#include <windows.h>

View File

@ -1065,6 +1065,9 @@ writeTerm2(term_t t, int prec, write_options *options, bool arg)
}
}
#if __YAP_PROLOG__
t = Yap_CvtTerm(t);
#endif
if ( PL_get_atom(t, &a) )
{ if ( !arg && prec < 1200 && priorityOperator((Module)NULL, a) > 0 )
{ if ( PutOpenBrace(out) &&

View File

@ -381,9 +381,14 @@ PL_get_number(term_t l, number *n) {
n->type = V_INTEGER;
n->value.i = YAP_IntOfTerm(t);
#ifdef O_GMP
} else {
} else if (YAP_IsBigNumTerm(t)) {
n->type = V_MPZ;
mpz_init(&n->value.mpq);
YAP_BigNumOfTerm(t, &n->value.mpz);
} else {
n->type = V_MPQ;
mpq_init(&n->value.mpq);
YAP_RationalOfTerm(t, &n->value.mpq);
#endif
}
}

View File

@ -149,6 +149,8 @@ void PL_license(const char *license, const char *module);
#define isTaggedInt(A) YAP_IsIntTerm(A)
#define valInt(A) YAP_IntOfTerm(A)
extern term_t Yap_CvtTerm(term_t ts);
#define clearNumber(n)
inline static int