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:
parent
a7f544a4b8
commit
2f4a2f3895
|
@ -1 +1 @@
|
||||||
1768
|
1769
|
||||||
|
|
|
@ -256,14 +256,15 @@ sll_to_number(signed long long n, ikpcb* pcb) {
|
||||||
if (((signed long long)(signed long) n) == n) {
|
if (((signed long long)(signed long) n) == n) {
|
||||||
return s_to_number(n, pcb);
|
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));
|
ikptr bn = ik_safe_alloc(pcb, align(sizeof(long long)+disp_bignum_data));
|
||||||
if (n > 0){
|
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;
|
*((long long*)(bn+disp_bignum_data)) = n;
|
||||||
} else {
|
} else {
|
||||||
ref(bn, 0) =
|
ref(bn, 0) =
|
||||||
(ikptr)(bignum_tag |
|
(ikptr)(bignum_tag |
|
||||||
(1 << bignum_length_shift) |
|
(len << bignum_length_shift) |
|
||||||
(1 << bignum_sign_shift));
|
(1 << bignum_sign_shift));
|
||||||
*((long long*)(bn+disp_bignum_data)) = -n;
|
*((long long*)(bn+disp_bignum_data)) = -n;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue