r22655 - gnucash/trunk - Drop workarounds for potential guile issues with long long

Geert Janssens gjanssens at code.gnucash.org
Sat Dec 15 12:59:35 EST 2012


Author: gjanssens
Date: 2012-12-15 12:59:35 -0500 (Sat, 15 Dec 2012)
New Revision: 22655
Trac: http://svn.gnucash.org/trac/changeset/22655

Modified:
   gnucash/trunk/configure.ac
   gnucash/trunk/src/engine/engine-helpers.c
Log:
Drop workarounds for potential guile issues with long long

- The workarounds for long long were added more than 12
years back (pre guile 1.6). One would reasonably assume this issue would
have been fixed by now.
- But more importantly, we can guarantee a proper 64 type
conversion by replacing scm_to/from_long_long with scm_to/from_int64
which is always 64bit, just as gint64

I have chosen nonetheless to keep this change in a separate commit so
it's easier to track if some obscure platform still manages to screw
this up.

Modified: gnucash/trunk/configure.ac
===================================================================
--- gnucash/trunk/configure.ac	2012-12-15 17:59:26 UTC (rev 22654)
+++ gnucash/trunk/configure.ac	2012-12-15 17:59:35 UTC (rev 22655)
@@ -400,34 +400,6 @@
 AC_SUBST(GUILE_LIBS)
 AC_SUBST(GUILE)
 
-
-### Check size of long_long - some guile's are broken.
-AC_MSG_CHECKING(if guile long_long is at least as big as gint64)
-AS_SCRUB_INCLUDE(CFLAGS)
-GNC_OLDCFLAGS="$CFLAGS"
-GNC_OLDLDFLAGS="$LDFLAGS"
-CFLAGS="${GNOME_CFLAGS} ${GUILE_INCS} ${CFLAGS} ${GLIB_CFLAGS}"
-LDFLAGS="${LDFLAGS} ${GLIB_LIBS}"
-AC_TRY_RUN([
-  #include <glib.h>
-  #include <libguile/__scm.h>
-  int main(int argc, char *argv[]) {
-    return(!(sizeof(long_long) >= sizeof(gint64)));
-  }
-],[
-  AC_MSG_RESULT(yes)
-  AC_CHECK_LIB(guile, scm_long_long2num,
-    AC_DEFINE(GUILE_LONG_LONG_OK,1,is sizeof(long_long) >= sizeof(gint64)))
-],[
-  AC_MSG_RESULT(no)
-],[
-  AC_MSG_RESULT(assuming yes)
-  AC_CHECK_LIB(guile, scm_long_long2num,
-    AC_DEFINE(GUILE_LONG_LONG_OK,1,is sizeof(long_long) >= sizeof(gint64)))
-])
-CFLAGS="$GNC_OLDCFLAGS"
-LDFLAGS="$GNC_OLDLDFLAGS"
-
 # One of the places this is critical is in gnc_scm_to_gint64 and inverse.
 # However, I'm sure we require this elsewhere, so don't remove this test
 # unless you've done sufficient code review/testing.

Modified: gnucash/trunk/src/engine/engine-helpers.c
===================================================================
--- gnucash/trunk/src/engine/engine-helpers.c	2012-12-15 17:59:26 UTC (rev 22654)
+++ gnucash/trunk/src/engine/engine-helpers.c	2012-12-15 17:59:35 UTC (rev 22655)
@@ -2229,79 +2229,13 @@
 SCM
 gnc_gint64_to_scm(const gint64 x)
 {
-#if GUILE_LONG_LONG_OK
-    return scm_from_long_long(x);
-#else
-    const gchar negative_p = (x < 0);
-    const guint64 magnitude = negative_p ? -x : x;
-    const guint32 lower_half = (guint32) (magnitude & 0xFFFFFFFF);
-    const guint32 upper_half = (guint32) (magnitude >> 32);
-    SCM result;
-
-    result = scm_sum(scm_ash(scm_from_ulong(upper_half), scm_from_int(32)),
-                     scm_from_ulong(lower_half));
-
-    if (negative_p)
-    {
-        return scm_difference(SCM_INUM0, result);
-    }
-    else
-    {
-        return result;
-    }
-#endif
+    return scm_from_int64(x);
 }
 
 gint64
 gnc_scm_to_gint64(SCM num)
 {
-#if GUILE_LONG_LONG_OK
-    return scm_to_long_long(num);
-#else
-    static SCM bits00to15_mask = SCM_BOOL_F;
-    SCM magnitude  = scm_abs(num);
-    SCM bits;
-    unsigned long c_bits;
-    long long     c_result = 0;
-    int                i;
-
-    /* This doesn't work -- atm (bit-extract 4000 0 32) proves it */
-    /*
-    SCM lower = scm_bit_extract(magnitude, scm_from_int(0), scm_from_int(32));
-    */
-
-    if (bits00to15_mask == SCM_BOOL_F)
-    {
-        bits00to15_mask = scm_from_ulong(0xFFFF);
-        scm_gc_protect_object (bits00to15_mask);
-    }
-
-    /*
-     * This isn't very complicated (IMHO).  We work from the "top" of
-     * the number downwards.  We assume this is no more than a 64-bit
-     * number, otherwise it will fail right away.  Anyways, we keep
-     * taking the top 16 bits of the number and move it to c_result.
-     * Then we 'remove' those bits from the original number and continue
-     * with the next 16 bits down, and so on.  -- warlord at mit.edu
-     * 2001/02/13
-     */
-    for (i = 48; i >= 0; i -= 16)
-    {
-        bits = scm_ash(magnitude, scm_from_int(-i));
-        c_bits = scm_to_ulong(scm_logand(bits, bits00to15_mask));
-        c_result += ((long long)c_bits << i);
-        magnitude = scm_difference(magnitude, scm_ash(bits, scm_from_int(i)));
-    }
-
-    if (scm_negative_p(num) != SCM_BOOL_F)
-    {
-        return(- c_result);
-    }
-    else
-    {
-        return(c_result);
-    }
-#endif
+    return scm_to_int64(num);
 }
 
 int



More information about the gnucash-changes mailing list