cannot release space from external GMPs.

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1491 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
vsc 2006-01-02 02:25:45 +00:00
parent e10213929a
commit 2d4d1f1ea8
3 changed files with 44 additions and 3 deletions

View File

@ -69,6 +69,41 @@ Yap_MkBigIntTerm(MP_INT *big)
return AbsAppl(ret);
}
Term
Yap_MkBigIntTermCopy(MP_INT *big)
{
int sz0 = mpz_sizeinbase(big, 2);
Int nlimbs;
MP_INT *dst = (MP_INT *)(H+1);
CELL *ret = H;
if (sz0 < SIZEOF_LONG_INT*8-1) {
int out = mpz_get_si(big);
return MkIntegerTerm(out);
}
nlimbs = (big->_mp_alloc)*(sizeof(mp_limb_t)/CellSize);
if (nlimbs > (ASP-ret)-1024) {
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 */
return TermNil;
}
#if GC_NO_TAGS
H[0] = (H-ret)*sizeof(CELL)+EndSpecials;
#else
H[0] = ((H-ret)*sizeof(CELL)+EndSpecials)|MBIT;
#endif
H++;
return AbsAppl(ret);
}
MP_INT *
Yap_BigIntOfTerm(Term t)
{

View File

@ -10,8 +10,13 @@
* File: c_interface.c *
* comments: c_interface primitives definition *
* *
* Last rev: $Date: 2006-01-02 02:16:18 $,$Author: vsc $ *
* Last rev: $Date: 2006-01-02 02:25:44 $,$Author: vsc $ *
* $Log: not supported by cvs2svn $
* Revision 1.78 2006/01/02 02:16:18 vsc
* support new interface between YAP and GMP, so that we don't rely on our own
* allocation routines.
* Several big fixes.
*
* Revision 1.77 2005/11/18 18:48:51 tiagosoares
* support for executing c code when a cut occurs
*
@ -421,7 +426,7 @@ YAP_MkBigNumTerm(void *big)
#if USE_GMP
Term I;
BACKUP_H();
I = Yap_MkBigIntTerm((MP_INT *)big);
I = Yap_MkBigIntTermCopy((MP_INT *)big);
RECOVER_H();
return I;
#else

View File

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