1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-20 02:30:23 +02:00

* Fix range checks of SCM_VALIDATE* macros.

This commit is contained in:
Dirk Herrmann 2000-06-30 09:48:25 +00:00
parent 627df12801
commit fdf25853e1
2 changed files with 16 additions and 5 deletions

View file

@ -1,3 +1,14 @@
2000-06-30 Dirk Herrmann <D.Herrmann@tu-bs.de>
* validate.h (SCM_VALIDATE_INUM_MIN_COPY,
SCM_VALIDATE_INUM_MIN_DEF_COPY, SCM_VALIDATE_INUM_RANGE_COPY):
Perform all range checks based on the input value. The former way
of using the value that is assigned to the target variable fails
if the assignment to the target variable itself can change the
value because of type conversion.
(SCM_ASSERT_RANGE): Use scm_out_of_range to signal range errors.
2000-06-30 Mikael Djurfeldt <mdj@mdj.nada.kth.se> 2000-06-30 Mikael Djurfeldt <mdj@mdj.nada.kth.se>
* gc.c (scm_gc_for_newcell): Behave gracefully also if scm_igc * gc.c (scm_gc_for_newcell): Behave gracefully also if scm_igc

View file

@ -1,4 +1,4 @@
/* $Id: validate.h,v 1.12 2000-06-05 11:39:46 dirk Exp $ */ /* $Id: validate.h,v 1.13 2000-06-30 09:48:25 dirk Exp $ */
/* Copyright (C) 1999, 2000 Free Software Foundation, Inc. /* Copyright (C) 1999, 2000 Free Software Foundation, Inc.
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
@ -83,7 +83,7 @@
do { scm_out_of_range_pos (FUNC_NAME, arg, SCM_MAKINUM (pos)); } while (0) do { scm_out_of_range_pos (FUNC_NAME, arg, SCM_MAKINUM (pos)); } while (0)
#define SCM_ASSERT_RANGE(pos, arg, f) \ #define SCM_ASSERT_RANGE(pos, arg, f) \
do { SCM_ASSERT (f, arg, SCM_OUTOFRANGE, FUNC_NAME); } while (0) do { if (!(f)) scm_out_of_range (FUNC_NAME, arg); } while (0)
#define SCM_MUST_MALLOC_TYPE(type) \ #define SCM_MUST_MALLOC_TYPE(type) \
((type *) scm_must_malloc (sizeof (type), FUNC_NAME)) ((type *) scm_must_malloc (sizeof (type), FUNC_NAME))
@ -212,8 +212,8 @@
#define SCM_VALIDATE_INUM_MIN_COPY(pos, k, min, cvar) \ #define SCM_VALIDATE_INUM_MIN_COPY(pos, k, min, cvar) \
do { \ do { \
SCM_ASSERT (SCM_INUMP (k), k, pos, FUNC_NAME); \ SCM_ASSERT (SCM_INUMP (k), k, pos, FUNC_NAME); \
SCM_ASSERT_RANGE (pos, k, (SCM_INUM (k) >= min)); \
cvar = SCM_INUM (k); \ cvar = SCM_INUM (k); \
SCM_ASSERT_RANGE (pos, k, (cvar >= min)); \
} while (0) } while (0)
#define SCM_VALIDATE_INUM_MIN_DEF_COPY(pos, k, min, default, cvar) \ #define SCM_VALIDATE_INUM_MIN_DEF_COPY(pos, k, min, default, cvar) \
@ -221,8 +221,8 @@
if (SCM_UNBNDP (k)) \ if (SCM_UNBNDP (k)) \
k = SCM_MAKINUM (default); \ k = SCM_MAKINUM (default); \
SCM_ASSERT (SCM_INUMP (k), k, pos, FUNC_NAME); \ SCM_ASSERT (SCM_INUMP (k), k, pos, FUNC_NAME); \
SCM_ASSERT_RANGE (pos, k, (SCM_INUM (k) >= min)); \
cvar = SCM_INUM (k); \ cvar = SCM_INUM (k); \
SCM_ASSERT_RANGE (pos, k, (cvar >= min)); \
} while (0) } while (0)
#define SCM_VALIDATE_INUM_DEF(pos, k, default) \ #define SCM_VALIDATE_INUM_DEF(pos, k, default) \
@ -257,8 +257,8 @@
#define SCM_VALIDATE_INUM_RANGE_COPY(pos, k, low, high, cvar) \ #define SCM_VALIDATE_INUM_RANGE_COPY(pos, k, low, high, cvar) \
do { \ do { \
SCM_ASSERT (SCM_INUMP (k), k, pos, FUNC_NAME); \ SCM_ASSERT (SCM_INUMP (k), k, pos, FUNC_NAME); \
SCM_ASSERT_RANGE (pos, k, low <= SCM_INUM (k) && SCM_INUM (k) < high); \
cvar = SCM_INUM (k); \ cvar = SCM_INUM (k); \
SCM_ASSERT_RANGE (pos, k, cvar >= low && cvar < high); \
} while (0) } while (0)
#define SCM_VALIDATE_NULL(pos, scm) SCM_MAKE_VALIDATE (pos, scm, NULLP) #define SCM_VALIDATE_NULL(pos, scm) SCM_MAKE_VALIDATE (pos, scm, NULLP)