summaryrefslogtreecommitdiff
path: root/libguile/unif.c
diff options
context:
space:
mode:
authorJim Blandy <jimb@red-bean.com>1996-12-18 21:41:44 +0000
committerJim Blandy <jimb@red-bean.com>1996-12-18 21:41:44 +0000
commit35de7ebe4a2f424a49bdcc856baaa0d61b978809 (patch)
tree3606546c63e3b1b3e15df9718e176f8055cf0c30 /libguile/unif.c
parent407775cb81cb5e254dfbacc3644ea888e694b7f2 (diff)
downloadguile-35de7ebe4a2f424a49bdcc856baaa0d61b978809.tar.gz
Give GCC more control flow information, so it can be sure that
variables aren't used uninitialized. * error.h (scm_error, scm_syserror, scm_syserror_msg, scm_sysmissing, scm_num_overflow, scm_out_of_range, scm_wrong_num_args, scm_wrong_type_arg, scm_memory_error, scm_misc_error): Tell GCC that these functions never return. * struct.c (scm_struct_ref, scm_struct_set_x): If we can't figure out the field type, call abort if SCM_ASSERT returns, to placate the optimizer. * stacks.c (scm_make_stack, scm_last_stack_frame): abort if scm_wta ever returns. We can't handle this case anyway, and this gives the optimizer more information. * unif.c (scm_uniform_vector_ref, scm_array_set_x): Abort if scm_wta ever returns. In some cases, the code is fine, but GCC isn't smart enough to figure that out; this usually happens when one variable is only initialized and used when a particular condition holds true, and we know that condition will never change within a given invocation of the function. In this case, we simply initialize the variables to placate the compiler, hopefully to a value which will cause a crash if it is ever actually used. * print.c (scm_iprin1): Initialize mw_pos. * read.c (scm_lreadrecparen): Initialize tl2, ans2. * throw.c (scm_ithrow): Initialize dynpair. * unif.c (scm_uniform_vector_ref): Initialize cra. * struct.c (init_struct): Initialize prot. * mbstrings.c (scm_print_mb_symbol): Initialize mw_pos and inc.
Diffstat (limited to 'libguile/unif.c')
-rw-r--r--libguile/unif.c37
1 files changed, 22 insertions, 15 deletions
diff --git a/libguile/unif.c b/libguile/unif.c
index 9f3aeefb2..922101722 100644
--- a/libguile/unif.c
+++ b/libguile/unif.c
@@ -469,7 +469,6 @@ scm_aind (ra, args, what)
register scm_sizet k = SCM_ARRAY_NDIM (ra);
scm_array_dim *s = SCM_ARRAY_DIMS (ra);
if (SCM_INUMP (args))
-
{
SCM_ASSERT (1 == k, scm_makfrom0str (what), SCM_WNA, NULL);
return pos + (SCM_INUM (args) - s->lbnd) * (s->inc);
@@ -1041,14 +1040,13 @@ scm_uniform_vector_ref (v, args)
SCM args;
{
long pos;
- if (SCM_IMP (v))
+ if (SCM_IMP (v))
{
SCM_ASRTGO (SCM_NULLP (args), badarg);
return v;
}
else if (SCM_ARRAYP (v))
-
{
pos = scm_aind (v, args, s_uniform_vector_ref);
v = SCM_ARRAY_V (v);
@@ -1075,7 +1073,9 @@ scm_uniform_vector_ref (v, args)
default:
if (SCM_NULLP (args))
return v;
- badarg:scm_wta (v, (char *) SCM_ARG1, s_uniform_vector_ref);
+ badarg:
+ scm_wta (v, (char *) SCM_ARG1, s_uniform_vector_ref);
+ abort ();
outrng:scm_out_of_range (s_uniform_vector_ref, SCM_MAKINUM (pos));
wna: scm_wrong_num_args (scm_makfrom0str (s_uniform_vector_ref));
case scm_tc7_smob:
@@ -1236,7 +1236,6 @@ scm_array_set_x (v, obj, args)
long pos;
SCM_ASRTGO (SCM_NIMP (v), badarg1);
if (SCM_ARRAYP (v))
-
{
pos = scm_aind (v, args, s_array_set_x);
v = SCM_ARRAY_V (v);
@@ -1244,7 +1243,6 @@ scm_array_set_x (v, obj, args)
else
{
if (SCM_NIMP (args))
-
{
SCM_ASSERT (SCM_CONSP (args) && SCM_INUMP (SCM_CAR (args)), args, SCM_ARG2, s_array_set_x);
pos = SCM_INUM (SCM_CAR (args));
@@ -1259,8 +1257,9 @@ scm_array_set_x (v, obj, args)
}
switch (SCM_TYP7 (v))
{
- default:
- badarg1:scm_wta (v, (char *) SCM_ARG1, s_array_set_x);
+ default: badarg1:
+ scm_wta (v, (char *) SCM_ARG1, s_array_set_x);
+ abort ();
outrng:scm_out_of_range (s_array_set_x, SCM_MAKINUM (pos));
wna: scm_wrong_num_args (scm_makfrom0str (s_array_set_x));
case scm_tc7_smob: /* enclosed */
@@ -1439,18 +1438,20 @@ scm_uniform_array_read_x (ra, port)
SCM ra;
SCM port;
{
- SCM cra, v = ra;
+ SCM cra = SCM_UNDEFINED, v = ra;
long sz, len, ans;
long start = 0;
+
if (SCM_UNBNDP (port))
- port = scm_cur_inp;
+ port = scm_cur_inp;
else
- SCM_ASSERT (SCM_NIMP (port) && SCM_OPINFPORTP (port), port, SCM_ARG2, s_uniform_array_read_x);
+ SCM_ASSERT (SCM_NIMP (port) && SCM_OPINFPORTP (port), port, SCM_ARG2,
+ s_uniform_array_read_x);
SCM_ASRTGO (SCM_NIMP (v), badarg1);
+
len = SCM_LENGTH (v);
loop:
- switch SCM_TYP7
- (v)
+ switch SCM_TYP7 (v)
{
default:
badarg1:scm_wta (v, (char *) SCM_ARG1, s_uniform_array_read_x);
@@ -1495,19 +1496,25 @@ loop:
break;
#endif
}
+
/* An ungetc before an fread will not work on some systems if setbuf(0).
do #define NOSETBUF in scmfig.h to fix this. */
if (SCM_CRDYP (port))
-
{ /* UGGH!!! */
ungetc (SCM_CGETUN (port), (FILE *)SCM_STREAM (port));
SCM_CLRDY (port); /* Clear ungetted char */
}
- SCM_SYSCALL (ans = fread (SCM_CHARS (v) + start * sz, (scm_sizet) sz, (scm_sizet) len, (FILE *)SCM_STREAM (port)));
+
+ SCM_SYSCALL (ans = fread (SCM_CHARS (v) + start * sz,
+ (scm_sizet) sz, (scm_sizet) len,
+ (FILE *)SCM_STREAM (port)));
+
if (SCM_TYP7 (v) == scm_tc7_bvect)
ans *= SCM_LONG_BIT;
+
if (v != ra && cra != ra)
scm_array_copy_x (cra, ra);
+
return SCM_MAKINUM (ans);
}