Included assert.h in Python.h -- it's absurd that this basic tool of

good C practice hasn't been available to everything all along.
Added Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) macro to pyport.h; this
just casts VALUE from type WIDE to type NARROW, but assert-fails if
Py_DEBUG is defined and info is lost due to casting.
Replaced a line in Fredrik's fix to marshal.c to use the new macro.
This commit is contained in:
Tim Peters 2000-07-23 19:28:35 +00:00
parent e21107145a
commit 8315ea5790
3 changed files with 21 additions and 2 deletions

View File

@ -31,7 +31,6 @@ redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#include "patchlevel.h" #include "patchlevel.h"
#include "config.h" #include "config.h"
#include "pyport.h"
/* config.h may or may not define DL_IMPORT */ /* config.h may or may not define DL_IMPORT */
#ifndef DL_IMPORT /* declarations for DLL import/export */ #ifndef DL_IMPORT /* declarations for DLL import/export */
@ -51,6 +50,9 @@ redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#ifdef HAVE_STDLIB_H #ifdef HAVE_STDLIB_H
#include <stdlib.h> #include <stdlib.h>
#endif #endif
#include <assert.h>
#include "pyport.h"
#include "myproto.h" #include "myproto.h"

View File

@ -27,6 +27,10 @@ RETSIGTYPE
Meaning: Expands to void or int, depending on what the platform wants Meaning: Expands to void or int, depending on what the platform wants
signal handlers to return. Note that only void is ANSI! signal handlers to return. Note that only void is ANSI!
Used in: Py_RETURN_FROM_SIGNAL_HANDLER Used in: Py_RETURN_FROM_SIGNAL_HANDLER
Py_DEBUG
Meaning: Extra checks compiled in for debug mode.
Used in: Py_SAFE_DOWNCAST
**************************************************************************/ **************************************************************************/
@ -74,6 +78,19 @@ extern "C" {
#define Py_RETURN_FROM_SIGNAL_HANDLER(VALUE) \ #define Py_RETURN_FROM_SIGNAL_HANDLER(VALUE) \
Py_FORCE_EXPANSION(RETSIGTYPE) ## _PySIGRETURN(VALUE) Py_FORCE_EXPANSION(RETSIGTYPE) ## _PySIGRETURN(VALUE)
/* Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW)
* Cast VALUE to type NARROW from type WIDE. In Py_DEBUG mode, this
* assert-fails if any information is lost.
* Caution:
* VALUE may be evaluated more than once.
*/
#ifdef Py_DEBUG
#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) \
(assert((WIDE)(NARROW)(VALUE) == (VALUE)), (NARROW)(VALUE))
#else
#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE)
#endif
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -69,7 +69,7 @@ w_more(int c, WFILE *p)
p->ptr = PyString_AS_STRING((PyStringObject *)p->str) + size; p->ptr = PyString_AS_STRING((PyStringObject *)p->str) + size;
p->end = p->end =
PyString_AS_STRING((PyStringObject *)p->str) + newsize; PyString_AS_STRING((PyStringObject *)p->str) + newsize;
*p->ptr++ = (char) c; *p->ptr++ = Py_SAFE_DOWNCAST(c, int, char);
} }
} }