guile-devel
[Top][All Lists]
Advanced

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

Re: Recent addition to numbers.c


From: Thien-Thi Nguyen
Subject: Re: Recent addition to numbers.c
Date: Thu, 06 Sep 2001 15:41:53 -0700

   From: Michael Livshin <address@hidden>
   Date: 04 Sep 2001 01:27:46 +0300

   very good of you to raise the question, really.  there's plenty to
   test in Guile's C interface.

the mechanics of introducing "make check" testing for numbers.c in
libguile are pretty simple.  below is a patch to Makefile.am, followed
by a (hastily) extracted numbers.test.c.  at this time, "make check"
with these changes fails.  when i run "gdb numbers.test", i see:

(gdb) r
Starting program: 
/home/ttn/build/.gnu/subversions/guile-core/libguile/numbers.test 

Program received signal SIGSEGV, Segmentation fault.
0x4004cc81 in scm_igc (what=0x400a2f7f "bignum") at gc.c:1062
(gdb) bt
#0  0x4004cc81 in scm_igc (what=0x400a2f7f "bignum") at gc.c:1062
#1  0x4004e52c in scm_must_malloc (size=4, what=0x400a2f7f "bignum")
    at gc.c:2009
#2  0x40062868 in scm_i_mkbig (nlen=2, sign=0) at numbers.c:1387
#3  0x40067fc7 in scm_i_int2big (n=2147483647)
    at ../libguile/num2integral.i.c:138
#4  0x40067f54 in scm_int2num (n=2147483647) at ../libguile/num2integral.i.c:98
#5  0x8048e57 in check_sanity () at numbers.test.c:41
#6  0x80492f7 in main (argc=1, argv=0xbffff314) at numbers.test.c:112
(gdb)

i haven't looked into this further, partly because i'm not confident
that the compilation procedure is properly auto-tools aware; maybe this
segfault is related to that in some way.

thi


_____________________________________________________________
cd /home/ttn/build/.gnu/subversions/guile-core/libguile/
cvs diff -N Makefile.am 
Index: Makefile.am
===================================================================
RCS file: /cvs/guile/guile-core/libguile/Makefile.am,v
retrieving revision 1.143
diff -u -p -w -r1.143 Makefile.am
--- Makefile.am 2001/08/31 12:13:50     1.143
+++ Makefile.am 2001/09/06 22:38:29
@@ -268,3 +268,14 @@ MOSTLYCLEANFILES = \
 CLEANFILES = libpath.h *.x *.doc guile-procedures.txt guile.texi
 
 MAINTAINERCLEANFILES = c-tokenize.c
+
+libguiletestprograms = numbers.test
+
+$(libguiletestprograms):
+       gcc -g -O2 -Wall -Wmissing-prototypes \
+               -I. -I.. \
+               -L.libs -lguile \
+               -L../qt/.libs -lqthreads \
+               address@hidden -o $@
+
+TESTS = $(libguiletestprograms)


_____________________________________________________
/* numbers.test.c */

#include "libguile.h"

/* FIXME: This is duplicated from numbers.c.  */
#ifdef HAVE_LONG_LONGS
# ifndef LLONG_MAX
#  define ULLONG_MAX ((unsigned long long) (-1))
#  define LLONG_MAX ((long long) (ULLONG_MAX >> 1))
#  define LLONG_MIN (~LLONG_MAX)
# endif
#endif


#define CHECK(type, v) \
  do { \
    if ((v) != scm_num2##type (scm_##type##2num (v), 1, "check_sanity")) \
      abort (); \
  } while (0);

static void
check_sanity ()
{
  CHECK (short, 0);
  CHECK (ushort, 0U);
  CHECK (int, 0);
  CHECK (uint, 0U);
  CHECK (long, 0L);
  CHECK (ulong, 0UL);
  CHECK (size, 0);
  CHECK (ptrdiff, 0);

  CHECK (short, -1);
  CHECK (int, -1);
  CHECK (long, -1L);
  CHECK (ptrdiff, -1);

  CHECK (short, SHRT_MAX);
  CHECK (short, SHRT_MIN);
  CHECK (ushort, USHRT_MAX);
  CHECK (int, INT_MAX);
  CHECK (int, INT_MIN);
  CHECK (uint, UINT_MAX);
  CHECK (long, LONG_MAX);
  CHECK (long, LONG_MIN);
  CHECK (ulong, ULONG_MAX);
  CHECK (size, SIZE_MAX);
  CHECK (ptrdiff, PTRDIFF_MAX);
  CHECK (ptrdiff, PTRDIFF_MIN);

#ifdef HAVE_LONG_LONGS
  CHECK (long_long, 0LL);
  CHECK (ulong_long, 0ULL);

  CHECK (long_long, -1LL);

  CHECK (long_long, LLONG_MAX);
  CHECK (long_long, LLONG_MIN);
  CHECK (ulong_long, ULLONG_MAX);
#endif
}

#undef CHECK

#define CHECK \
        scm_internal_catch (SCM_BOOL_T, check_body, &data, check_handler, 
&data); \
        if (!SCM_FALSEP (data)) abort();

static SCM
check_body (void *data)
{
  SCM num = *(SCM *) data;
  scm_num2ulong (num, 1, NULL);

  return SCM_UNSPECIFIED;
}

static SCM
check_handler (void *data, SCM tag, SCM throw_args)
{
  SCM *num = (SCM *) data;
  *num = SCM_BOOL_F;

  return SCM_UNSPECIFIED;
}

SCM_DEFINE (scm_sys_check_number_conversions, "%check-number-conversions", 0, 
0, 0,
            (),
            "Number conversion sanity checking.")
#define FUNC_NAME s_scm_sys_check_number_conversions
{
  SCM data = SCM_MAKINUM (-1);
  CHECK;
  data = scm_int2num (INT_MIN);
  CHECK;
  data = scm_ulong2num (ULONG_MAX);
  data = scm_difference (SCM_INUM0, data);
  CHECK;
  data = scm_ulong2num (ULONG_MAX);
  data = scm_sum (SCM_MAKINUM (1), data); data = scm_difference (SCM_INUM0, 
data);
  CHECK;
  data = scm_int2num (-10000); data = scm_product (data, data); data = 
scm_product (data, data);
  CHECK;

  return SCM_UNSPECIFIED;
}
#undef FUNC_NAME

int
main (int argc, char **argv)
{
  check_sanity ();
  return 0;
}

/* numbers.test.c ends here */



reply via email to

[Prev in Thread] Current Thread [Next in Thread]