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:
parent
e21107145a
commit
8315ea5790
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue