[Top][All Lists]
[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 */