Kaydet (Commit) 8315ea57 authored tarafından Tim Peters's avatar Tim Peters

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.
üst e2110714
...@@ -31,7 +31,6 @@ redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES. ...@@ -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. ...@@ -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 ...@@ -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" { ...@@ -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) ...@@ -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);
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment