From 2f4a2f38950b3b678861b1ab5bddeb9bd39cd12f Mon Sep 17 00:00:00 2001 From: Abdulaziz Ghuloum Date: Thu, 30 Apr 2009 12:25:17 +0300 Subject: [PATCH] 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. --- scheme/last-revision | 2 +- src/ikarus-pointers.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/scheme/last-revision b/scheme/last-revision index ca91012..ff5a506 100644 --- a/scheme/last-revision +++ b/scheme/last-revision @@ -1 +1 @@ -1768 +1769 diff --git a/src/ikarus-pointers.c b/src/ikarus-pointers.c index 8a6f457..016ff4b 100644 --- a/src/ikarus-pointers.c +++ b/src/ikarus-pointers.c @@ -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; }