fix memory leak in mod.
This commit is contained in:
parent
ecb03a61c0
commit
7e108201b0
26
C/arith2.c
26
C/arith2.c
@ -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:
|
||||
|
@ -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)
|
||||
{
|
||||
|
3
H/eval.h
3
H/eval.h
@ -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));
|
||||
|
||||
|
Reference in New Issue
Block a user