fix memory leak in mod.

This commit is contained in:
Vitor Santos Costa 2009-06-05 10:55:28 -05:00
parent ecb03a61c0
commit 7e108201b0
3 changed files with 36 additions and 23 deletions

View File

@ -91,15 +91,7 @@ p_mod(Term t1, Term t2) {
return Yap_ArithError(TYPE_ERROR_INTEGER, t2, "mod/2");
#ifdef USE_GMP
case (CELL)big_int_e:
/* I know the term is much larger, so: */
{
MP_INT new;
Int i1 = IntegerOfTerm(t1);
mpz_init_set_si(&new, i1);
mpz_fdiv_r(&new, &new, Yap_BigIntOfTerm(t2));
RBIG(&new);
}
return Yap_gmp_mod_int_big(IntegerOfTerm(t1), Yap_BigIntOfTerm(t2));
#endif
case db_ref_e:
RERROR();
@ -113,26 +105,14 @@ p_mod(Term t1, Term t2) {
case long_int_e:
/* modulo between bignum and integer */
{
mpz_t tmp;
MP_INT new;
Int i2 = IntegerOfTerm(t2);
if (i2 == 0) goto zero_divisor;
mpz_init(&new);
mpz_init_set_si(tmp, i2);
mpz_fdiv_r(&new, Yap_BigIntOfTerm(t1), tmp);
mpz_clear(tmp);
RBIG(&new);
return Yap_gmp_mod_big_int(Yap_BigIntOfTerm(t1), i2);
}
case (CELL)big_int_e:
/* two bignums */
{
MP_INT new;
mpz_init(&new);
mpz_fdiv_r(&new, Yap_BigIntOfTerm(t1), Yap_BigIntOfTerm(t2));
RBIG(&new);
}
return Yap_gmp_mod_big_big(Yap_BigIntOfTerm(t1), Yap_BigIntOfTerm(t2));
case double_e:
return Yap_ArithError(TYPE_ERROR_INTEGER, t2, "mod/2");
case db_ref_e:

View File

@ -280,6 +280,36 @@ Yap_gmp_ior_big_big(MP_INT *b1, MP_INT *b2)
return MkBigAndClose(&new);
}
Term
Yap_gmp_mod_big_big(MP_INT *b1, MP_INT *b2)
{
MP_INT new;
mpz_init(&new);
mpz_fdiv_r(&new, b1, b2);
return MkBigAndClose(&new);
}
Term
Yap_gmp_mod_big_int(MP_INT *b, Int i2)
{
MP_INT new;
mpz_init_set_si(&new, i2);
mpz_fdiv_r(&new, b, &new);
return MkBigAndClose(&new);
}
Term
Yap_gmp_mod_int_big(Int i1, MP_INT *b)
{
MP_INT new;
mpz_init_set_si(&new, i1);
mpz_fdiv_r(&new, &new, b);
RBIG(&new);
}
Term
Yap_gmp_add_float_big(Float d, MP_INT *b)
{

View File

@ -219,6 +219,9 @@ Term STD_PROTO(Yap_gmp_mul_big_big,(MP_INT *, MP_INT *));
Term STD_PROTO(Yap_gmp_div_big_big,(MP_INT *, MP_INT *));
Term STD_PROTO(Yap_gmp_and_big_big,(MP_INT *, MP_INT *));
Term STD_PROTO(Yap_gmp_ior_big_big,(MP_INT *, MP_INT *));
Term STD_PROTO(Yap_gmp_mod_big_big,(MP_INT *, MP_INT *));
Term STD_PROTO(Yap_gmp_mod_big_int,(MP_INT *, Int));
Term STD_PROTO(Yap_gmp_mod_int_big,(Int, MP_INT *));
Term STD_PROTO(Yap_gmp_exp_ints,(Int,Int));
Term STD_PROTO(Yap_gmp_exp_big_int,(MP_INT *,Int));