[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: