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

View File

@ -280,6 +280,36 @@ Yap_gmp_ior_big_big(MP_INT *b1, MP_INT *b2)
return MkBigAndClose(&new); 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 Term
Yap_gmp_add_float_big(Float d, MP_INT *b) 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_div_big_big,(MP_INT *, MP_INT *));
Term STD_PROTO(Yap_gmp_and_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_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_ints,(Int,Int));
Term STD_PROTO(Yap_gmp_exp_big_int,(MP_INT *,Int)); Term STD_PROTO(Yap_gmp_exp_big_int,(MP_INT *,Int));