Bug#573978: libgmp-ocaml: Wrong conversion from int on 64 bits computer
Hi all,
> I confirm that I maintain this library when I feel a need for it - that
> is, when I actually need to use it. I can fix this bug when I have time,
> or JC can fix it.
I already made a fix in my own version but I'm not 100% sure it is ok. I
would prefer having David checking and applying the patch. It is
attached (it is a patch for mlgmp_z.c only; I don't know if other files
should be fixed as well).
best regards,
--
Jean-Christophe
Index: mlgmp_z.c
===================================================================
RCS file: /users/demons/filliatr/ARCHIVE/caml/creal/mlgmp/mlgmp_z.c,v
retrieving revision 1.1
diff -c -r1.1 mlgmp_z.c
*** mlgmp_z.c 25 Feb 2003 14:01:50 -0000 1.1
--- mlgmp_z.c 19 Feb 2010 08:10:21 -0000
***************
*** 63,69 ****
CAMLparam1(ml_val);
CAMLlocal1(r);
r=alloc_mpz();
! mpz_init_set_si(*mpz_val(r), Int_val(ml_val));
CAMLreturn(r);
}
--- 63,69 ----
CAMLparam1(ml_val);
CAMLlocal1(r);
r=alloc_mpz();
! mpz_init_set_si(*mpz_val(r), Long_val(ml_val)); /* FIX */
CAMLreturn(r);
}
***************
*** 88,94 ****
value _mlgmp_z2_from_int(value r, value ml_val)
{
CAMLparam2(r, ml_val);
! mpz_init_set_si(*mpz_val(r), Int_val(ml_val));
CAMLreturn(Val_unit);
}
--- 88,94 ----
value _mlgmp_z2_from_int(value r, value ml_val)
{
CAMLparam2(r, ml_val);
! mpz_init_set_si(*mpz_val(r), Long_val(ml_val)); /* FIX */
CAMLreturn(Val_unit);
}
***************
*** 151,164 ****
CAMLparam2(a, b); \
CAMLlocal1(r); \
r=alloc_init_mpz(); \
! mpz_##op(*mpz_val(r), *mpz_val(a), Int_val(b)); \
CAMLreturn(r); \
} \
\
value _mlgmp_z2_##op(value r, value a, value b) \
{ \
CAMLparam3(r, a, b); \
! mpz_##op(*mpz_val(r), *mpz_val(a), Int_val(b)); \
CAMLreturn(Val_unit); \
}
--- 151,164 ----
CAMLparam2(a, b); \
CAMLlocal1(r); \
r=alloc_init_mpz(); \
! mpz_##op(*mpz_val(r), *mpz_val(a), Long_val(b)); \
CAMLreturn(r); \
} \
\
value _mlgmp_z2_##op(value r, value a, value b) \
{ \
CAMLparam3(r, a, b); \
! mpz_##op(*mpz_val(r), *mpz_val(a), Long_val(b)); \
CAMLreturn(Val_unit); \
}
***************
*** 196,202 ****
CAMLparam3(a, b, modulus);
CAMLlocal1(r);
r=alloc_init_mpz();
! mpz_powm_ui(*mpz_val(r), *mpz_val(a), Int_val(b), *mpz_val(modulus));
CAMLreturn(r);
}
--- 196,202 ----
CAMLparam3(a, b, modulus);
CAMLlocal1(r);
r=alloc_init_mpz();
! mpz_powm_ui(*mpz_val(r), *mpz_val(a), Long_val(b), *mpz_val(modulus));
CAMLreturn(r);
}
***************
*** 205,211 ****
CAMLparam2(a, b);
CAMLlocal1(r);
r=alloc_init_mpz();
! mpz_ui_pow_ui(*mpz_val(r), Int_val(a), Int_val(b));
CAMLreturn(r);
}
--- 205,211 ----
CAMLparam2(a, b);
CAMLlocal1(r);
r=alloc_init_mpz();
! mpz_ui_pow_ui(*mpz_val(r), Long_val(a), Long_val(b));
CAMLreturn(r);
}
***************
*** 221,234 ****
value _mlgmp_z2_powm_ui(value r, value a, value b, value modulus)
{
CAMLparam4(r, a, b, modulus);
! mpz_powm_ui(*mpz_val(r), *mpz_val(a), Int_val(b), *mpz_val(modulus));
CAMLreturn(Val_unit);
}
value _mlgmp_z2_ui_pow_ui(value r, value a, value b)
{
CAMLparam3(r, a, b);
! mpz_ui_pow_ui(*mpz_val(r), Int_val(a), Int_val(b));
CAMLreturn(Val_unit);
}
--- 221,234 ----
value _mlgmp_z2_powm_ui(value r, value a, value b, value modulus)
{
CAMLparam4(r, a, b, modulus);
! mpz_powm_ui(*mpz_val(r), *mpz_val(a), Long_val(b), *mpz_val(modulus));
CAMLreturn(Val_unit);
}
value _mlgmp_z2_ui_pow_ui(value r, value a, value b)
{
CAMLparam3(r, a, b);
! mpz_ui_pow_ui(*mpz_val(r), Long_val(a), Long_val(b));
CAMLreturn(Val_unit);
}
***************
*** 376,382 ****
{ \
CAMLparam2(n, d); \
CAMLlocal3(q, r, qr); \
! unsigned long int ui_d = Int_val(d); \
\
if (! ui_d) division_by_zero(); \
\
--- 376,382 ----
{ \
CAMLparam2(n, d); \
CAMLlocal3(q, r, qr); \
! unsigned long int ui_d = Long_val(d); \
\
if (! ui_d) division_by_zero(); \
\
***************
*** 395,401 ****
{ \
CAMLparam2(n, d); \
CAMLlocal1(q); \
! unsigned long int ui_d = Int_val(d); \
\
if (! ui_d) division_by_zero(); \
\
--- 395,401 ----
{ \
CAMLparam2(n, d); \
CAMLlocal1(q); \
! unsigned long int ui_d = Long_val(d); \
\
if (! ui_d) division_by_zero(); \
\
***************
*** 409,415 ****
value _mlgmp_z2_##kind##div_q_ui(value q, value n, value d) \
{ \
CAMLparam3(q, n, d); \
! unsigned long int ui_d = Int_val(d); \
\
if (! ui_d) division_by_zero(); \
\
--- 409,415 ----
value _mlgmp_z2_##kind##div_q_ui(value q, value n, value d) \
{ \
CAMLparam3(q, n, d); \
! unsigned long int ui_d = Long_val(d); \
\
if (! ui_d) division_by_zero(); \
\
***************
*** 422,428 ****
{ \
CAMLparam2(n, d); \
CAMLlocal1(r); \
! unsigned long int ui_d = Int_val(d); \
\
if (! ui_d) division_by_zero(); \
\
--- 422,428 ----
{ \
CAMLparam2(n, d); \
CAMLlocal1(r); \
! unsigned long int ui_d = Long_val(d); \
\
if (! ui_d) division_by_zero(); \
\
***************
*** 436,442 ****
value _mlgmp_z2_##kind##div_r_ui(value r, value n, value d) \
{ \
CAMLparam3(r, n, d); \
! unsigned long int ui_d = Int_val(d); \
\
if (! ui_d) division_by_zero(); \
\
--- 436,442 ----
value _mlgmp_z2_##kind##div_r_ui(value r, value n, value d) \
{ \
CAMLparam3(r, n, d); \
! unsigned long int ui_d = Long_val(d); \
\
if (! ui_d) division_by_zero(); \
\
***************
*** 448,454 ****
value _mlgmp_z_##kind##div_ui(value n, value d) \
{ \
CAMLparam2(n, d); \
! unsigned long int ui_d = Int_val(d); \
\
if (! ui_d) division_by_zero(); \
\
--- 448,454 ----
value _mlgmp_z_##kind##div_ui(value n, value d) \
{ \
CAMLparam2(n, d); \
! unsigned long int ui_d = Long_val(d); \
\
if (! ui_d) division_by_zero(); \
\
***************
*** 492,498 ****
{ \
CAMLparam2(n, d); \
CAMLlocal1(q); \
! unsigned int ld = Int_val(d); \
\
if (! ld) \
division_by_zero(); \
--- 492,498 ----
{ \
CAMLparam2(n, d); \
CAMLlocal1(q); \
! unsigned int ld = Long_val(d); \
\
if (! ld) \
division_by_zero(); \
***************
*** 507,513 ****
value _mlgmp_z2_##op(value q, value n, value d) \
{ \
CAMLparam3(q, n, d); \
! unsigned int ld = Int_val(d); \
\
if (! ld) \
division_by_zero(); \
--- 507,513 ----
value _mlgmp_z2_##op(value q, value n, value d) \
{ \
CAMLparam3(q, n, d); \
! unsigned int ld = Long_val(d); \
\
if (! ld) \
division_by_zero(); \
***************
*** 584,590 ****
value _mlgmp_z_compare_si(value a, value b)
{
CAMLparam2(a, b);
! CAMLreturn(Val_int(mpz_cmp_si(*mpz_val(a), Int_val(b))));
}
/*** Number theory */
--- 584,590 ----
value _mlgmp_z_compare_si(value a, value b)
{
CAMLparam2(a, b);
! CAMLreturn(Val_int(mpz_cmp_si(*mpz_val(a), Long_val(b))));
}
/*** Number theory */
***************
*** 645,657 ****
value _mlgmp_z_kronecker_si(value a, value b)
{
CAMLparam2(a, b);
! CAMLreturn(Val_int(mpz_kronecker_si(*mpz_val(a), Int_val(b))));
}
value _mlgmp_z_si_kronecker(value a, value b)
{
CAMLparam2(a, b);
! CAMLreturn(Val_int(mpz_si_kronecker(Int_val(a), *mpz_val(b))));
}
value _mlgmp_z_remove(value a, value b)
--- 645,657 ----
value _mlgmp_z_kronecker_si(value a, value b)
{
CAMLparam2(a, b);
! CAMLreturn(Val_int(mpz_kronecker_si(*mpz_val(a), Long_val(b))));
}
value _mlgmp_z_si_kronecker(value a, value b)
{
CAMLparam2(a, b);
! CAMLreturn(Val_int(mpz_si_kronecker(Long_val(a), *mpz_val(b))));
}
value _mlgmp_z_remove(value a, value b)
***************
*** 673,679 ****
CAMLparam1(a); \
CAMLlocal1(r); \
r = alloc_init_mpz(); \
! mpz_##op(*mpz_val(r), Int_val(a)); \
CAMLreturn(r); \
}
--- 673,679 ----
CAMLparam1(a); \
CAMLlocal1(r); \
r = alloc_init_mpz(); \
! mpz_##op(*mpz_val(r), Long_val(a)); \
CAMLreturn(r); \
}
***************
*** 686,692 ****
CAMLparam2(n, k);
CAMLlocal1(r);
r = alloc_init_mpz();
! mpz_bin_uiui(*mpz_val(r), Int_val(n), Int_val(k));
CAMLreturn(r);
}
--- 686,692 ----
CAMLparam2(n, k);
CAMLlocal1(r);
r = alloc_init_mpz();
! mpz_bin_uiui(*mpz_val(r), Long_val(n), Long_val(k));
CAMLreturn(r);
}
***************
*** 711,717 ****
value _mlgmp_z_##op(value a, value b) \
{ \
CAMLparam2(a, b); \
! CAMLreturn(Val_int(mpz_##op(*mpz_val(a), Int_val(b)))); \
}
z_int_binary_op_ui(scan0)
--- 711,717 ----
value _mlgmp_z_##op(value a, value b) \
{ \
CAMLparam2(a, b); \
! CAMLreturn(Val_int(mpz_##op(*mpz_val(a), Long_val(b)))); \
}
z_int_binary_op_ui(scan0)
***************
*** 724,730 ****
CAMLparam2(state, n); \
CAMLlocal1(r); \
r = alloc_init_mpz(); \
! mpz_##op(*mpz_val(r), *randstate_val(state), Int_val(n)); \
CAMLreturn(r); \
}
--- 724,730 ----
CAMLparam2(state, n); \
CAMLlocal1(r); \
r = alloc_init_mpz(); \
! mpz_##op(*mpz_val(r), *randstate_val(state), Long_val(n)); \
CAMLreturn(r); \
}
Reply to: