avoid sideffects from MkBigInt

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1524 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
vsc 2006-01-18 15:34:54 +00:00
parent 1c77e3cf32
commit 745fed2679
11 changed files with 37 additions and 49 deletions

View File

@ -10,8 +10,13 @@
* * * *
* File: absmi.c * * File: absmi.c *
* comments: Portable abstract machine interpreter * * comments: Portable abstract machine interpreter *
* Last rev: $Date: 2006-01-17 14:10:40 $,$Author: vsc $ * * Last rev: $Date: 2006-01-18 15:34:53 $,$Author: vsc $ *
* $Log: not supported by cvs2svn $ * $Log: not supported by cvs2svn $
* Revision 1.192 2006/01/17 14:10:40 vsc
* YENV may be an HW register (breaks some tabling code)
* All YAAM instructions are now brackedted, so Op introduced an { and EndOp introduces an }. This is because Ricardo assumes that.
* Fix attvars when COROUTING is undefined.
*
* Revision 1.191 2006/01/02 02:16:17 vsc * Revision 1.191 2006/01/02 02:16:17 vsc
* support new interface between YAP and GMP, so that we don't rely on our own * support new interface between YAP and GMP, so that we don't rely on our own
* allocation routines. * allocation routines.
@ -329,7 +334,15 @@ AritFunctorOfTerm(Term t) {
#define TMP_BIG(v) Yap_BigTmp #define TMP_BIG(v) Yap_BigTmp
#define RINT(v) return(MkIntegerTerm(v)) #define RINT(v) return(MkIntegerTerm(v))
#define RFLOAT(v) return(MkFloatTerm(v)) #define RFLOAT(v) return(MkFloatTerm(v))
#define RBIG(v) return(Yap_MkBigIntTerm(v)) #define RBIG(v) return(rbig(v))
static inline Term rbig(MP_INT *big)
{
Term t = Yap_MkBigIntTerm(big);
mpz_clear(big);
return t;
}
#define RERROR() return(TermNil) #define RERROR() return(TermNil)
#define ArithIEval(t,v) Yap_Eval(Deref(t),v) #define ArithIEval(t,v) Yap_Eval(Deref(t),v)

View File

@ -751,7 +751,7 @@ Yap_GetValue(Atom a)
} }
#ifdef USE_GMP #ifdef USE_GMP
else { else {
out = Yap_MkBigIntTermCopy(Yap_BigIntOfTerm(out)); out = Yap_MkBigIntTerm(Yap_BigIntOfTerm(out));
} }
#endif #endif
} }

View File

@ -101,6 +101,7 @@ EvalToTerm(blob_type f, union arith_ret *res)
case big_int_e: case big_int_e:
{ {
Term t = Yap_MkBigIntTerm(res->big); Term t = Yap_MkBigIntTerm(res->big);
mpz_clear(res->big);
return t; return t;
} }
#endif #endif

View File

@ -67,6 +67,7 @@ EvalToTerm(blob_type f, union arith_ret *res)
case big_int_e: case big_int_e:
{ {
Term t = Yap_MkBigIntTerm(res->big); Term t = Yap_MkBigIntTerm(res->big);
mpz_clear(res->big);
return t; return t;
} }
#endif #endif

View File

@ -37,44 +37,6 @@ Yap_MkBigIntTerm(MP_INT *big)
MP_INT *dst = (MP_INT *)(H+1); MP_INT *dst = (MP_INT *)(H+1);
CELL *ret = H; CELL *ret = H;
if (mpz_fits_slong_p(big)) {
int out = mpz_get_si(big);
mpz_clear(big);
return MkIntegerTerm(out);
}
nlimbs = (big->_mp_alloc)*(sizeof(mp_limb_t)/CellSize);
if (nlimbs > (ASP-ret)-1024) {
mpz_clear(big);
return TermNil;
}
H[0] = (CELL)FunctorBigInt;
dst->_mp_size = big->_mp_size;
dst->_mp_alloc = big->_mp_alloc;
memmove((void *)(dst+1), (const void *)(big->_mp_d), nlimbs*CellSize);
H = (CELL *)(dst+1)+nlimbs;
if ((char *)H-(char *)ret > MAX_SPECIALS_TAG-EndSpecials) {
/* too large */
mpz_clear(big);
return TermNil;
}
#if GC_NO_TAGS
H[0] = (H-ret)*sizeof(CELL)+EndSpecials;
#else
H[0] = ((H-ret)*sizeof(CELL)+EndSpecials)|MBIT;
#endif
H++;
mpz_clear(big);
return AbsAppl(ret);
}
Term
Yap_MkBigIntTermCopy(MP_INT *big)
{
Int nlimbs;
MP_INT *dst = (MP_INT *)(H+1);
CELL *ret = H;
if (mpz_fits_slong_p(big)) { if (mpz_fits_slong_p(big)) {
int out = mpz_get_si(big); int out = mpz_get_si(big);
return MkIntegerTerm(out); return MkIntegerTerm(out);
@ -132,6 +94,7 @@ Yap_MkULLIntTerm(YAP_ULONG_LONG n)
return MkIntegerTerm(mpz_get_si(new)); return MkIntegerTerm(mpz_get_si(new));
} }
t = Yap_MkBigIntTerm(new); t = Yap_MkBigIntTerm(new);
mpz_clear(new);
return t; return t;
#else #else
return MkIntegerTerm(n); return MkIntegerTerm(n);

View File

@ -10,8 +10,12 @@
* File: c_interface.c * * File: c_interface.c *
* comments: c_interface primitives definition * * comments: c_interface primitives definition *
* * * *
* Last rev: $Date: 2006-01-16 02:57:51 $,$Author: vsc $ * * Last rev: $Date: 2006-01-18 15:34:53 $,$Author: vsc $ *
* $Log: not supported by cvs2svn $ * $Log: not supported by cvs2svn $
* Revision 1.81 2006/01/16 02:57:51 vsc
* fix bug with very large integers
* fix bug where indexing code was looking at code after a cut.
*
* Revision 1.80 2006/01/02 03:35:44 vsc * Revision 1.80 2006/01/02 03:35:44 vsc
* fix interface and docs * fix interface and docs
* *
@ -432,7 +436,7 @@ YAP_MkBigNumTerm(void *big)
#if USE_GMP #if USE_GMP
Term I; Term I;
BACKUP_H(); BACKUP_H();
I = Yap_MkBigIntTermCopy((MP_INT *)big); I = Yap_MkBigIntTerm((MP_INT *)big);
RECOVER_H(); RECOVER_H();
return I; return I;
#else #else

View File

@ -44,15 +44,19 @@ EvalToTerm(blob_type bt, union arith_ret *res)
{ {
switch (bt) { switch (bt) {
case long_int_e: case long_int_e:
return(MkIntegerTerm(res->Int)); return MkIntegerTerm(res->Int);
case double_e: case double_e:
return(MkFloatTerm(res->dbl)); return MkFloatTerm(res->dbl);
#ifdef USE_GMP #ifdef USE_GMP
case big_int_e: case big_int_e:
return(Yap_MkBigIntTerm(res->big)); {
Term t = Yap_MkBigIntTerm(res->big);
mpz_clear(res->big);
return t;
}
#endif #endif
default: default:
return(TermNil); return TermNil;
} }
} }

View File

@ -442,6 +442,7 @@ ParseTerm(int prio, JMPBUFF *FailBuff)
mpz_init(new); mpz_init(new);
mpz_neg(new, Yap_BigIntOfTerm(t)); mpz_neg(new, Yap_BigIntOfTerm(t));
t = Yap_MkBigIntTerm(new); t = Yap_MkBigIntTerm(new);
mpz_clear(new);
} }
#endif #endif
else else

View File

@ -229,6 +229,7 @@ read_int_overflow(const char *s, Int base, Int val)
mpz_init_set_str (new, s, base); mpz_init_set_str (new, s, base);
t = Yap_MkBigIntTerm(new); t = Yap_MkBigIntTerm(new);
mpz_clear(new);
return t; return t;
#else #else
/* try to scan it as a float */ /* try to scan it as a float */

View File

@ -10,7 +10,7 @@
* File: TermExt.h * * File: TermExt.h *
* mods: * * mods: *
* comments: Extensions to standard terms for YAP * * comments: Extensions to standard terms for YAP *
* version: $Id: TermExt.h,v 1.5 2006-01-02 02:25:45 vsc Exp $ * * version: $Id: TermExt.h,v 1.6 2006-01-18 15:34:54 vsc Exp $ *
*************************************************************************/ *************************************************************************/
#ifdef USE_SYSTEM_MALLOC #ifdef USE_SYSTEM_MALLOC
@ -343,7 +343,6 @@ IsLongIntTerm (Term t)
Term STD_PROTO (Yap_MkBigIntTerm, (MP_INT *)); Term STD_PROTO (Yap_MkBigIntTerm, (MP_INT *));
Term STD_PROTO (Yap_MkBigIntTermCopy, (MP_INT *));
MP_INT *STD_PROTO (Yap_BigIntOfTerm, (Term)); MP_INT *STD_PROTO (Yap_BigIntOfTerm, (Term));
inline EXTERN int IsBigIntTerm (Term); inline EXTERN int IsBigIntTerm (Term);

View File

@ -16,6 +16,7 @@
<h2>Yap-5.1.0:</h2> <h2>Yap-5.1.0:</h2>
<ul> <ul>
<li> FIXED: ok, MkBigInt shouldn't free the bigint.</li>
<li> FIXED: MkBigInt already frees bigint.</li> <li> FIXED: MkBigInt already frees bigint.</li>
<li> FIXED: don't pass a pointer to a mpz_t. (Nuno Fonseca)</li> <li> FIXED: don't pass a pointer to a mpz_t. (Nuno Fonseca)</li>
<li> FIXED: YENV may be an HW register ('d break some tabling code) <li> FIXED: YENV may be an HW register ('d break some tabling code)