bignum should always reset pre_alloc_base and recover Heap space

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@158 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
vsc 2001-09-18 15:14:11 +00:00
parent 8f72bc3c91
commit cbd499b8df
5 changed files with 18 additions and 3 deletions

View File

@ -139,6 +139,7 @@ p_mod(Term t1, Term t2 E_ARGS)
MP_INT *new = PreAllocBigNum();
Int r = mpz_mod_ui(new, l1, i2);
CleanBigNum();
RINT((mpz_sgn(l1) ? r : -r));
} else if (i2 == 0) {
goto zero_divisor;
@ -146,6 +147,7 @@ p_mod(Term t1, Term t2 E_ARGS)
MP_INT *new = PreAllocBigNum();
Int r = mpz_mod_ui(new, l1, -i2);
CleanBigNum();
RINT((mpz_sgn(l1) ? r : -r));
}
}
@ -211,6 +213,7 @@ p_mod(Term t1, Term t2 E_ARGS)
MP_INT *new = PreAllocBigNum();
Int r = mpz_mod_ui(new, v1.big, v2.Int);
CleanBigNum();
RINT((mpz_sgn(v1.big) ? r : -r));
} else if (v2.Int == 0) {
goto zero_divisor;
@ -218,6 +221,7 @@ p_mod(Term t1, Term t2 E_ARGS)
MP_INT *new = PreAllocBigNum();
Int r = mpz_mod_ui(new, v1.big, -v2.Int);
CleanBigNum();
RINT((mpz_sgn(v1.big) ? r : -r));
}
case double_e:
@ -267,6 +271,7 @@ fdiv_bigint(MP_INT *b1,MP_INT *b2)
mpf_set_z(f2, b2);
mpf_div(f1, f1, f2);
res = mpf_get_d(f1);
CleanBigNum();
return(res);
} else {
return(f1/f2);
@ -450,6 +455,7 @@ mpz_xor(MP_INT *new, MP_INT *r1, MP_INT *r2)
mpz_com(n3, r2);
mpz_and(n3, n3, new);
mpz_ior(new, n2, n3);
CleanBigNum();
}
#endif
#endif

View File

@ -53,6 +53,13 @@ PreAllocBigNum(void)
return(ret);
}
void
CleanBigNum(void)
{
H = pre_alloc_base;
pre_alloc_base = NULL;
}
MP_INT *
InitBigNum(Int in)
{

View File

@ -130,7 +130,7 @@ low_level_trace(yap_low_level_port port, PredEntry *pred, CELL *args)
extern int gc_calls;
vsc_count++;
/* if (vsc_count < 2518) return; */
/* if (vsc_count < 24) return; */
/* if (vsc_count > 500000) exit(0); */
/* if (gc_calls < 1) return;*/
YP_fprintf(YP_stderr,"%lu (%d)", vsc_count, CurrentModule);

View File

@ -16,6 +16,8 @@
<h2>Yap-4.3.20:</h2>
<ul>
<li>FIXED: always release stack after InitBigNum (report from
Nicos Angelopoulos).</li>
<li>FIXED: random would not load in windows (report from
Henrik Boström).</li>
<li>FIXED: don't send warnings about repeated predicates from

View File

@ -10,7 +10,7 @@
* File: TermExt.h *
* mods: *
* comments: Extensions to standard terms for YAP *
* version: $Id: TermExt.h.m4,v 1.2 2001-06-06 10:38:10 stasinos Exp $ *
* version: $Id: TermExt.h.m4,v 1.3 2001-09-18 15:14:11 vsc Exp $ *
*************************************************************************/
#if USE_OFFSETS
@ -160,10 +160,10 @@ Inline(IsLongIntTerm, int, Term, t, IsApplTerm(t) && FunctorOfTerm(t) == Functor
MP_INT *STD_PROTO(PreAllocBigNum,(void));
void STD_PROTO(ClearAllocBigNum,(void));
MP_INT *STD_PROTO(InitBigNum,(Int));
Term STD_PROTO(MkBigIntTerm, (MP_INT *));
MP_INT *STD_PROTO(BigIntOfTerm, (Term));
void STD_PROTO(CleanBigNum,(void));
Inline(IsBigIntTerm, int, Term, t, IsApplTerm(t) && FunctorOfTerm(t) == FunctorBigInt)