This is the mail archive of the
guile@sourceware.cygnus.com
mailing list for the Guile project.
Bugreport + patch: backtrace.c
- To: Guile Mailing List <guile at sourceware dot cygnus dot com>
- Subject: Bugreport + patch: backtrace.c
- From: Dirk Herrmann <dirk at ida dot ing dot tu-bs dot de>
- Date: Tue, 18 Jan 2000 18:58:22 +0100 (MET)
Hi!
The implementation of scm_display_error_message is buggy: It stumbles
across the often discussed problem, that SCM values might erroneously be
tested for being true or false (in the C sense).
Here's the patch, which also attempts to rewrite the code to be better
understandable and removes calls to SCM_IMP and SCM_NIMP.
Index: backtrace.c
===================================================================
RCS file: /cvs/guile/guile/guile-core/libguile/backtrace.c,v
retrieving revision 1.44
diff -u -p -r1.44 backtrace.c
--- backtrace.c 2000/01/11 18:48:56 1.44
+++ backtrace.c 2000/01/18 17:50:52
@@ -109,16 +109,16 @@ display_header (SCM source, SCM port)
void
scm_display_error_message (SCM message, SCM args, SCM port)
{
- if (SCM_IMP (message) || !SCM_ROSTRINGP (message) || SCM_IMP (args)
- || !scm_list_p (args))
+ if (SCM_ROSTRINGP (message) && SCM_NFALSEP(scm_list_p (args)))
{
+ scm_simple_format(port,message,args);
+ scm_newline(port);
+ }
+ else
+ {
scm_prin1 (message, port, 0);
scm_putc ('\n', port);
- return;
}
-
- scm_simple_format(port,message,args);
- scm_newline(port);
}
static void
@@ -263,11 +263,13 @@ SCM_DEFINE (scm_set_print_params_x, "set
"")
#define FUNC_NAME s_scm_set_print_params_x
{
- int i, n = scm_ilength (params);
+ int i;
+ int n;
SCM ls;
print_params_t *new_params;
- SCM_ASSERT (n >= 1, params, SCM_ARG2, FUNC_NAME);
- for (ls = params; SCM_NIMP (ls); ls = SCM_CDR (ls))
+
+ SCM_VALIDATE_NONEMPTYLIST_COPYLEN(2, params, n);
+ for (ls = params; SCM_NNULLP (ls); ls = SCM_CDR (ls))
SCM_ASSERT (scm_ilength (SCM_CAR (params)) == 2
&& SCM_INUMP (SCM_CAAR (ls))
&& SCM_INUM (SCM_CAAR (ls)) >= 0