The code for converting signed long long numbers to scheme bignums

was broken (on 32-bits, the 64-bit value was put in a bignum of 1
limb instead of 2).  Thanks to Andreas Rottmann for reporting it.
This commit is contained in:
Abdulaziz Ghuloum 2009-04-30 12:25:17 +03:00
parent a7f544a4b8
commit 2f4a2f3895
2 changed files with 4 additions and 3 deletions

View File

@ -1 +1 @@
1768
1769

View File

@ -256,14 +256,15 @@ sll_to_number(signed long long n, ikpcb* pcb) {
if (((signed long long)(signed long) n) == n) {
return s_to_number(n, pcb);
}
int len = sizeof(long long) / sizeof(mp_limb_t);
ikptr bn = ik_safe_alloc(pcb, align(sizeof(long long)+disp_bignum_data));
if (n > 0){
ref(bn, 0) = (ikptr)(bignum_tag | (1 << bignum_length_shift));
ref(bn, 0) = (ikptr)(bignum_tag | (len << bignum_length_shift));
*((long long*)(bn+disp_bignum_data)) = n;
} else {
ref(bn, 0) =
(ikptr)(bignum_tag |
(1 << bignum_length_shift) |
(len << bignum_length_shift) |
(1 << bignum_sign_shift));
*((long long*)(bn+disp_bignum_data)) = -n;
}