diff --git a/Include/Python.h b/Include/Python.h index 3cea5914d3b..8ba466fe42c 100644 --- a/Include/Python.h +++ b/Include/Python.h @@ -31,7 +31,6 @@ redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES. #include "patchlevel.h" #include "config.h" -#include "pyport.h" /* config.h may or may not define DL_IMPORT */ #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 #include #endif +#include + +#include "pyport.h" #include "myproto.h" diff --git a/Include/pyport.h b/Include/pyport.h index 4faba7c9f0e..ed8a28eb7b6 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -27,6 +27,10 @@ RETSIGTYPE Meaning: Expands to void or int, depending on what the platform wants signal handlers to return. Note that only void is ANSI! 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) \ 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 } #endif diff --git a/Python/marshal.c b/Python/marshal.c index 74c547417a2..f6447131d0e 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -69,7 +69,7 @@ w_more(int c, WFILE *p) p->ptr = PyString_AS_STRING((PyStringObject *)p->str) + size; p->end = PyString_AS_STRING((PyStringObject *)p->str) + newsize; - *p->ptr++ = (char) c; + *p->ptr++ = Py_SAFE_DOWNCAST(c, int, char); } }