summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Include/Python.h4
-rw-r--r--Include/pyport.h17
-rw-r--r--Python/marshal.c2
3 files changed, 21 insertions, 2 deletions
diff --git a/Include/Python.h b/Include/Python.h
index 3cea591..8ba466f 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 <stdlib.h>
#endif
+#include <assert.h>
+
+#include "pyport.h"
#include "myproto.h"
diff --git a/Include/pyport.h b/Include/pyport.h
index 4faba7c..ed8a28e 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 74c5474..f644713 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);
}
}