diff -r f4c6dab59cd8 Doc/c-api/module.rst
--- a/Doc/c-api/module.rst Tue Apr 26 17:04:18 2016 +0200
+++ b/Doc/c-api/module.rst Wed Apr 27 20:47:18 2016 +0300
@@ -410,6 +410,16 @@ state:
be used from the module's initialization function. This steals a reference to
*value*. Return ``-1`` on error, ``0`` on success.
+ .. note::
+ The behavior of this function is controlled by defining the
+ macro :c:macro:`PY_MODULE_ADDOBJECT_CLEAN` before including
+ :file:`Python.h`. If the macro was defined, :c:func:`PyModule_AddObject`
+ steals a reference unconditionally. Otherwise it steals a reference
+ only on success, and the caller is responsible for decref'ing it on
+ error. This behavior will change in a future Python version to steals
+ a reference unconditionally. It is best to always define
+ :c:macro:`PY_MODULE_ADDOBJECT_CLEAN`.
+
.. c:function:: int PyModule_AddIntConstant(PyObject *module, const char *name, long value)
Add an integer constant to *module* as *name*. This convenience function can be
diff -r f4c6dab59cd8 Doc/includes/noddy.c
--- a/Doc/includes/noddy.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Doc/includes/noddy.c Wed Apr 27 20:47:18 2016 +0300
@@ -1,3 +1,5 @@
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include
typedef struct {
diff -r f4c6dab59cd8 Doc/includes/noddy2.c
--- a/Doc/includes/noddy2.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Doc/includes/noddy2.c Wed Apr 27 20:47:18 2016 +0300
@@ -1,3 +1,5 @@
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include
#include "structmember.h"
diff -r f4c6dab59cd8 Doc/includes/noddy3.c
--- a/Doc/includes/noddy3.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Doc/includes/noddy3.c Wed Apr 27 20:47:18 2016 +0300
@@ -1,3 +1,5 @@
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include
#include "structmember.h"
diff -r f4c6dab59cd8 Doc/includes/noddy4.c
--- a/Doc/includes/noddy4.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Doc/includes/noddy4.c Wed Apr 27 20:47:18 2016 +0300
@@ -1,3 +1,5 @@
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include
#include "structmember.h"
diff -r f4c6dab59cd8 Doc/includes/shoddy.c
--- a/Doc/includes/shoddy.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Doc/includes/shoddy.c Wed Apr 27 20:47:18 2016 +0300
@@ -1,3 +1,5 @@
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include
typedef struct {
diff -r f4c6dab59cd8 Doc/whatsnew/3.6.rst
--- a/Doc/whatsnew/3.6.rst Tue Apr 26 17:04:18 2016 +0200
+++ b/Doc/whatsnew/3.6.rst Wed Apr 27 20:47:18 2016 +0300
@@ -402,6 +402,13 @@ Build and C API Changes
* New :c:func:`Py_FinalizeEx` API which indicates if flushing buffered data
failed (:issue:`5319`).
+* The behavior of :c:func:`PyModule_AddObject` is now controlled by defining
+ the macro :c:macro:`PY_MODULE_ADDOBJECT_CLEAN` before including
+ :file:`Python.h`. If the macro was defined, the function steals a reference
+ unconditionally. Otherwise it steals a reference only on success, and the
+ caller is responsible for decref'ing it on error.
+ (Contributed by Serhiy Storchaka in :issue:`XXXXX`.)
+
Deprecated
==========
@@ -428,7 +435,9 @@ Deprecated Python modules, functions and
Deprecated functions and types of the C API
-------------------------------------------
-* None yet.
+* Use of :c:func:`PyModule_AddObject` without defining the macro
+ :c:macro:`PY_MODULE_ADDOBJECT_CLEAN` is deprecated now.
+
Deprecated features
@@ -546,3 +555,7 @@ Changes in the C API
* :c:func:`Py_Exit` (and the main interpreter) now override the exit status
with 120 if flushing buffered data failed. See :issue:`5319`.
+
+* It is best to define the macro :c:macro:`PY_MODULE_ADDOBJECT_CLEAN` before
+ including :file:`Python.h` and let :c:func:`PyModule_AddObject` itself to
+ decref a reference to object on error. See :issue:`XXXXX`.
diff -r f4c6dab59cd8 Include/modsupport.h
--- a/Include/modsupport.h Tue Apr 26 17:04:18 2016 +0200
+++ b/Include/modsupport.h Wed Apr 27 20:47:18 2016 +0300
@@ -44,7 +44,18 @@ PyAPI_FUNC(int) PyArg_VaParseTupleAndKey
#endif
PyAPI_FUNC(PyObject *) Py_VaBuildValue(const char *, va_list);
-PyAPI_FUNC(int) PyModule_AddObject(PyObject *, const char *, PyObject *);
+/* If PY_MODULE_ADDOBJECT_CLEAN is defined, PyModule_AddObject()
+ unconditionally steals a reference. Otherwise it sleals a reference only
+ on success. */
+#ifdef PY_MODULE_ADDOBJECT_CLEAN
+# define PyModule_AddObject _PyModule_AddObject
+#else
+PyAPI_FUNC(int) PyModule_AddObject(PyObject *, const char *, PyObject *)
+ Py_GCC_ATTRIBUTE((deprecated("Use of PyModule_AddObject() without defined "
+ "PY_MODULE_ADDOBJECT_CLEAN can cause a leak")))
+;
+#endif
+PyAPI_FUNC(int) _PyModule_AddObject(PyObject *, const char *, PyObject *);
PyAPI_FUNC(int) PyModule_AddIntConstant(PyObject *, const char *, long);
PyAPI_FUNC(int) PyModule_AddStringConstant(PyObject *, const char *, const char *);
#define PyModule_AddIntMacro(m, c) PyModule_AddIntConstant(m, #c, c)
diff -r f4c6dab59cd8 Misc/NEWS
--- a/Misc/NEWS Tue Apr 26 17:04:18 2016 +0200
+++ b/Misc/NEWS Wed Apr 27 20:47:18 2016 +0300
@@ -1119,6 +1119,9 @@ Tools/Demos
C API
-----
+- Issue #XXXXX: Defining the macro PY_MODULE_ADDOBJECT_CLEAN before including
+ "Python.h" now controls the behavior of PyModule_AddObject() on error.
+
- Issue #26312: SystemError is now raised in all programming bugs with using
PyArg_ParseTupleAndKeywords(). RuntimeError did raised before in some
programming bugs.
diff -r f4c6dab59cd8 Modules/_bz2module.c
--- a/Modules/_bz2module.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_bz2module.c Wed Apr 27 20:47:18 2016 +0300
@@ -1,6 +1,7 @@
/* _bz2 - Low-level Python interface to libbzip2. */
#define PY_SSIZE_T_CLEAN
+#define PY_MODULE_ADDOBJECT_CLEAN
#include "Python.h"
#include "structmember.h"
diff -r f4c6dab59cd8 Modules/_collectionsmodule.c
--- a/Modules/_collectionsmodule.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_collectionsmodule.c Wed Apr 27 20:47:18 2016 +0300
@@ -1,3 +1,5 @@
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "structmember.h"
diff -r f4c6dab59cd8 Modules/_csv.c
--- a/Modules/_csv.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_csv.c Wed Apr 27 20:47:18 2016 +0300
@@ -9,6 +9,7 @@ module instead.
*/
#define MODULE_VERSION "1.0"
+#define PY_MODULE_ADDOBJECT_CLEAN
#include "Python.h"
#include "structmember.h"
diff -r f4c6dab59cd8 Modules/_ctypes/_ctypes.c
--- a/Modules/_ctypes/_ctypes.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_ctypes/_ctypes.c Wed Apr 27 20:47:18 2016 +0300
@@ -100,6 +100,7 @@ bytes(cdata)
*/
#define PY_SSIZE_T_CLEAN
+#define PY_MODULE_ADDOBJECT_CLEAN
#include "Python.h"
#include "structmember.h"
diff -r f4c6dab59cd8 Modules/_datetimemodule.c
--- a/Modules/_datetimemodule.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_datetimemodule.c Wed Apr 27 20:47:18 2016 +0300
@@ -2,6 +2,8 @@
* http://www.zope.org/Members/fdrake/DateTimeWiki/FrontPage
*/
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "structmember.h"
diff -r f4c6dab59cd8 Modules/_decimal/_decimal.c
--- a/Modules/_decimal/_decimal.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_decimal/_decimal.c Wed Apr 27 20:47:18 2016 +0300
@@ -26,6 +26,8 @@
*/
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include
#include "longintrepr.h"
#include "pythread.h"
@@ -5818,9 +5820,8 @@ PyInit__decimal(void)
/* Init mpd_ssize_t constants */
for (ssize_cm = ssize_constants; ssize_cm->name != NULL; ssize_cm++) {
- ASSIGN_PTR(obj, PyLong_FromSsize_t(ssize_cm->val));
- CHECK_INT(PyModule_AddObject(m, ssize_cm->name, obj));
- obj = NULL;
+ CHECK_INT(PyModule_AddObject(m, ssize_cm->name,
+ PyLong_FromSsize_t(ssize_cm->val)));
}
/* Init int constants */
diff -r f4c6dab59cd8 Modules/_elementtree.c
--- a/Modules/_elementtree.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_elementtree.c Wed Apr 27 20:47:18 2016 +0300
@@ -12,6 +12,7 @@
*/
#define PY_SSIZE_T_CLEAN
+#define PY_MODULE_ADDOBJECT_CLEAN
#include "Python.h"
#include "structmember.h"
diff -r f4c6dab59cd8 Modules/_functoolsmodule.c
--- a/Modules/_functoolsmodule.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_functoolsmodule.c Wed Apr 27 20:47:18 2016 +0300
@@ -1,3 +1,5 @@
+
+#define PY_MODULE_ADDOBJECT_CLEAN
#include "Python.h"
#include "structmember.h"
diff -r f4c6dab59cd8 Modules/_hashopenssl.c
--- a/Modules/_hashopenssl.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_hashopenssl.c Wed Apr 27 20:47:18 2016 +0300
@@ -12,6 +12,7 @@
*/
#define PY_SSIZE_T_CLEAN
+#define PY_MODULE_ADDOBJECT_CLEAN
#include "Python.h"
#include "structmember.h"
diff -r f4c6dab59cd8 Modules/_heapqmodule.c
--- a/Modules/_heapqmodule.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_heapqmodule.c Wed Apr 27 20:47:18 2016 +0300
@@ -6,6 +6,8 @@ annotated by François Pinard, and conve
*/
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
static int
diff -r f4c6dab59cd8 Modules/_io/_iomodule.c
--- a/Modules/_io/_iomodule.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_io/_iomodule.c Wed Apr 27 20:47:18 2016 +0300
@@ -8,6 +8,8 @@
*/
#define PY_SSIZE_T_CLEAN
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "structmember.h"
#include "_iomodule.h"
@@ -644,7 +646,6 @@ PyInit__io(void)
goto fail; \
Py_INCREF(type); \
if (PyModule_AddObject(m, name, (PyObject *)type) < 0) { \
- Py_DECREF(type); \
goto fail; \
}
@@ -764,7 +765,6 @@ PyInit__io(void)
return m;
fail:
- Py_XDECREF(state->unsupported_operation);
Py_DECREF(m);
return NULL;
}
diff -r f4c6dab59cd8 Modules/_json.c
--- a/Modules/_json.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_json.c Wed Apr 27 20:47:18 2016 +0300
@@ -1,3 +1,5 @@
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "structmember.h"
#include "accu.h"
@@ -1960,12 +1962,10 @@ PyInit__json(void)
goto fail;
Py_INCREF((PyObject*)&PyScannerType);
if (PyModule_AddObject(m, "make_scanner", (PyObject*)&PyScannerType) < 0) {
- Py_DECREF((PyObject*)&PyScannerType);
goto fail;
}
Py_INCREF((PyObject*)&PyEncoderType);
if (PyModule_AddObject(m, "make_encoder", (PyObject*)&PyEncoderType) < 0) {
- Py_DECREF((PyObject*)&PyEncoderType);
goto fail;
}
return m;
diff -r f4c6dab59cd8 Modules/_lsprof.c
--- a/Modules/_lsprof.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_lsprof.c Wed Apr 27 20:47:18 2016 +0300
@@ -1,3 +1,5 @@
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "frameobject.h"
#include "rotatingtree.h"
diff -r f4c6dab59cd8 Modules/_lzmamodule.c
--- a/Modules/_lzmamodule.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_lzmamodule.c Wed Apr 27 20:47:18 2016 +0300
@@ -6,6 +6,7 @@
*/
#define PY_SSIZE_T_CLEAN
+#define PY_MODULE_ADDOBJECT_CLEAN
#include "Python.h"
#include "structmember.h"
@@ -1452,10 +1453,7 @@ module_add_int_constant(PyObject *m, con
PyObject *o = PyLong_FromLongLong(value);
if (o == NULL)
return -1;
- if (PyModule_AddObject(m, name, o) == 0)
- return 0;
- Py_DECREF(o);
- return -1;
+ return PyModule_AddObject(m, name, o);
}
#define ADD_INT_PREFIX_MACRO(m, macro) \
diff -r f4c6dab59cd8 Modules/_multiprocessing/multiprocessing.c
--- a/Modules/_multiprocessing/multiprocessing.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_multiprocessing/multiprocessing.c Wed Apr 27 20:47:18 2016 +0300
@@ -7,6 +7,8 @@
* Licensed to PSF under a Contributor Agreement.
*/
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "multiprocessing.h"
diff -r f4c6dab59cd8 Modules/_operator.c
--- a/Modules/_operator.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_operator.c Wed Apr 27 20:47:18 2016 +0300
@@ -1,3 +1,5 @@
+
+#define PY_MODULE_ADDOBJECT_CLEAN
#include "Python.h"
diff -r f4c6dab59cd8 Modules/_pickle.c
--- a/Modules/_pickle.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_pickle.c Wed Apr 27 20:47:18 2016 +0300
@@ -1,3 +1,5 @@
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "structmember.h"
diff -r f4c6dab59cd8 Modules/_randommodule.c
--- a/Modules/_randommodule.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_randommodule.c Wed Apr 27 20:47:18 2016 +0300
@@ -66,6 +66,8 @@
/* ---------------------------------------------------------------*/
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include /* for seeding to current time */
diff -r f4c6dab59cd8 Modules/_sqlite/module.c
--- a/Modules/_sqlite/module.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_sqlite/module.c Wed Apr 27 20:47:18 2016 +0300
@@ -21,6 +21,8 @@
* 3. This notice may not be removed or altered from any source distribution.
*/
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "connection.h"
#include "statement.h"
#include "cursor.h"
diff -r f4c6dab59cd8 Modules/_ssl.c
--- a/Modules/_ssl.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_ssl.c Wed Apr 27 20:47:18 2016 +0300
@@ -15,6 +15,7 @@
*/
#define PY_SSIZE_T_CLEAN
+#define PY_MODULE_ADDOBJECT_CLEAN
#include "Python.h"
diff -r f4c6dab59cd8 Modules/_struct.c
--- a/Modules/_struct.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_struct.c Wed Apr 27 20:47:18 2016 +0300
@@ -4,6 +4,7 @@
character strings, and unsigned numbers */
#define PY_SSIZE_T_CLEAN
+#define PY_MODULE_ADDOBJECT_CLEAN
#include "Python.h"
#include "structmember.h"
diff -r f4c6dab59cd8 Modules/_testbuffer.c
--- a/Modules/_testbuffer.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_testbuffer.c Wed Apr 27 20:47:18 2016 +0300
@@ -3,6 +3,7 @@
#define PY_SSIZE_T_CLEAN
+#define PY_MODULE_ADDOBJECT_CLEAN
#include "Python.h"
diff -r f4c6dab59cd8 Modules/_testcapimodule.c
--- a/Modules/_testcapimodule.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_testcapimodule.c Wed Apr 27 20:47:18 2016 +0300
@@ -6,6 +6,7 @@
*/
#define PY_SSIZE_T_CLEAN
+#define PY_MODULE_ADDOBJECT_CLEAN
#include "Python.h"
#include
diff -r f4c6dab59cd8 Modules/_testmultiphase.c
--- a/Modules/_testmultiphase.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_testmultiphase.c Wed Apr 27 20:47:18 2016 +0300
@@ -2,6 +2,8 @@
/* Testing module for multi-phase initialization of extension modules (PEP 489)
*/
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
/* Example objects */
diff -r f4c6dab59cd8 Modules/_threadmodule.c
--- a/Modules/_threadmodule.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_threadmodule.c Wed Apr 27 20:47:18 2016 +0300
@@ -2,6 +2,8 @@
/* Thread module */
/* Interface to Sjoerd's portable C thread library */
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "structmember.h" /* offsetof */
diff -r f4c6dab59cd8 Modules/_tkinter.c
--- a/Modules/_tkinter.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_tkinter.c Wed Apr 27 20:47:18 2016 +0300
@@ -22,6 +22,7 @@ Copyright (C) 1994 Steen Lumholt.
*/
#define PY_SSIZE_T_CLEAN
+#define PY_MODULE_ADDOBJECT_CLEAN
#include "Python.h"
#include
@@ -3495,7 +3496,6 @@ PyInit__tkinter(void)
}
Py_INCREF(o);
if (PyModule_AddObject(m, "TclError", o)) {
- Py_DECREF(o);
Py_DECREF(m);
return NULL;
}
@@ -3552,7 +3552,6 @@ PyInit__tkinter(void)
return NULL;
}
if (PyModule_AddObject(m, "TkappType", o)) {
- Py_DECREF(o);
Py_DECREF(m);
return NULL;
}
@@ -3564,7 +3563,6 @@ PyInit__tkinter(void)
return NULL;
}
if (PyModule_AddObject(m, "TkttType", o)) {
- Py_DECREF(o);
Py_DECREF(m);
return NULL;
}
@@ -3576,7 +3574,6 @@ PyInit__tkinter(void)
return NULL;
}
if (PyModule_AddObject(m, "Tcl_Obj", o)) {
- Py_DECREF(o);
Py_DECREF(m);
return NULL;
}
diff -r f4c6dab59cd8 Modules/_weakref.c
--- a/Modules/_weakref.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/_weakref.c Wed Apr 27 20:47:18 2016 +0300
@@ -1,3 +1,5 @@
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
diff -r f4c6dab59cd8 Modules/arraymodule.c
--- a/Modules/arraymodule.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/arraymodule.c Wed Apr 27 20:47:18 2016 +0300
@@ -4,6 +4,8 @@
The item type is restricted to simple C types like int or float */
#define PY_SSIZE_T_CLEAN
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "structmember.h"
diff -r f4c6dab59cd8 Modules/cjkcodecs/cjkcodecs.h
--- a/Modules/cjkcodecs/cjkcodecs.h Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/cjkcodecs/cjkcodecs.h Wed Apr 27 20:47:18 2016 +0300
@@ -8,6 +8,8 @@
#define _CJKCODECS_H_
#define PY_SSIZE_T_CLEAN
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "multibytecodec.h"
diff -r f4c6dab59cd8 Modules/cjkcodecs/multibytecodec.c
--- a/Modules/cjkcodecs/multibytecodec.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/cjkcodecs/multibytecodec.c Wed Apr 27 20:47:18 2016 +0300
@@ -5,6 +5,8 @@
*/
#define PY_SSIZE_T_CLEAN
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "structmember.h"
#include "multibytecodec.h"
diff -r f4c6dab59cd8 Modules/cmathmodule.c
--- a/Modules/cmathmodule.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/cmathmodule.c Wed Apr 27 20:47:18 2016 +0300
@@ -2,6 +2,8 @@
/* much code borrowed from mathmodule.c */
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "_math.h"
/* we need DBL_MAX, DBL_MIN, DBL_EPSILON, DBL_MANT_DIG and FLT_RADIX from
diff -r f4c6dab59cd8 Modules/gcmodule.c
--- a/Modules/gcmodule.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/gcmodule.c Wed Apr 27 20:47:18 2016 +0300
@@ -23,6 +23,8 @@
*/
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "frameobject.h" /* for PyFrame_ClearFreeList */
#include "pytime.h" /* for _PyTime_GetMonotonicClock() */
diff -r f4c6dab59cd8 Modules/itertoolsmodule.c
--- a/Modules/itertoolsmodule.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/itertoolsmodule.c Wed Apr 27 20:47:18 2016 +0300
@@ -1,5 +1,7 @@
#define PY_SSIZE_T_CLEAN
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "structmember.h"
diff -r f4c6dab59cd8 Modules/mathmodule.c
--- a/Modules/mathmodule.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/mathmodule.c Wed Apr 27 20:47:18 2016 +0300
@@ -52,6 +52,8 @@ raised for division by zero and mod by z
returned.
*/
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "_math.h"
diff -r f4c6dab59cd8 Modules/md5module.c
--- a/Modules/md5module.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/md5module.c Wed Apr 27 20:47:18 2016 +0300
@@ -16,6 +16,8 @@
/* MD5 objects */
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "hashlib.h"
#include "pystrhex.h"
diff -r f4c6dab59cd8 Modules/ossaudiodev.c
--- a/Modules/ossaudiodev.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/ossaudiodev.c Wed Apr 27 20:47:18 2016 +0300
@@ -20,6 +20,8 @@
*/
#define PY_SSIZE_T_CLEAN
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "structmember.h"
@@ -1083,16 +1085,18 @@ build_namelists (PyObject *module)
PyList_SET_ITEM(names, i, s);
}
- if (PyModule_AddObject(module, "control_labels", labels) == -1)
- goto error2;
- if (PyModule_AddObject(module, "control_names", names) == -1)
- goto error1;
+ if (PyModule_AddObject(module, "control_labels", labels) == -1) {
+ Py_DECREF(names);
+ return -1;
+ }
+ if (PyModule_AddObject(module, "control_names", names) == -1) {
+ return -1;
+ }
return 0;
error2:
Py_XDECREF(labels);
-error1:
Py_XDECREF(names);
return -1;
}
diff -r f4c6dab59cd8 Modules/overlapped.c
--- a/Modules/overlapped.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/overlapped.c Wed Apr 27 20:47:18 2016 +0300
@@ -7,6 +7,8 @@
/* XXX check overflow and DWORD <-> Py_ssize_t conversions
Check itemsize */
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "structmember.h"
diff -r f4c6dab59cd8 Modules/parsermodule.c
--- a/Modules/parsermodule.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/parsermodule.c Wed Apr 27 20:47:18 2016 +0300
@@ -30,6 +30,8 @@
* Lib/symbol.h and Include/token.h.
*/
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h" /* general Python API */
#include "Python-ast.h" /* mod_ty */
#include "graminit.h" /* symbols defined in the grammar */
diff -r f4c6dab59cd8 Modules/posixmodule.c
--- a/Modules/posixmodule.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/posixmodule.c Wed Apr 27 20:47:18 2016 +0300
@@ -23,6 +23,7 @@
#endif /* __APPLE__ */
#define PY_SSIZE_T_CLEAN
+#define PY_MODULE_ADDOBJECT_CLEAN
#include "Python.h"
#include "structmember.h"
@@ -13067,7 +13068,7 @@ static const char * const have_functions
PyMODINIT_FUNC
INITFUNC(void)
{
- PyObject *m, *v;
+ PyObject *m;
PyObject *list;
const char * const *trace;
@@ -13080,11 +13081,8 @@ INITFUNC(void)
return NULL;
/* Initialize environ dictionary */
- v = convertenviron();
- Py_XINCREF(v);
- if (v == NULL || PyModule_AddObject(m, "environ", v) != 0)
- return NULL;
- Py_DECREF(v);
+ if (PyModule_AddObject(m, "environ", convertenviron()) != 0)
+ return NULL;
if (all_ins(m))
return NULL;
diff -r f4c6dab59cd8 Modules/pwdmodule.c
--- a/Modules/pwdmodule.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/pwdmodule.c Wed Apr 27 20:47:18 2016 +0300
@@ -1,6 +1,8 @@
/* UNIX password file access module */
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "posixmodule.h"
diff -r f4c6dab59cd8 Modules/pyexpat.c
--- a/Modules/pyexpat.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/pyexpat.c Wed Apr 27 20:47:18 2016 +0300
@@ -1,3 +1,5 @@
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include
diff -r f4c6dab59cd8 Modules/resource.c
--- a/Modules/resource.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/resource.c Wed Apr 27 20:47:18 2016 +0300
@@ -1,3 +1,5 @@
+
+#define PY_MODULE_ADDOBJECT_CLEAN
#include "Python.h"
#include
diff -r f4c6dab59cd8 Modules/selectmodule.c
--- a/Modules/selectmodule.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/selectmodule.c Wed Apr 27 20:47:18 2016 +0300
@@ -4,6 +4,8 @@
have any value except INVALID_SOCKET.
*/
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include
diff -r f4c6dab59cd8 Modules/sha1module.c
--- a/Modules/sha1module.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/sha1module.c Wed Apr 27 20:47:18 2016 +0300
@@ -16,6 +16,8 @@
/* SHA1 objects */
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "hashlib.h"
#include "pystrhex.h"
diff -r f4c6dab59cd8 Modules/sha256module.c
--- a/Modules/sha256module.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/sha256module.c Wed Apr 27 20:47:18 2016 +0300
@@ -16,6 +16,8 @@
/* SHA objects */
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "structmember.h"
#include "hashlib.h"
diff -r f4c6dab59cd8 Modules/sha512module.c
--- a/Modules/sha512module.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/sha512module.c Wed Apr 27 20:47:18 2016 +0300
@@ -16,6 +16,8 @@
/* SHA objects */
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "structmember.h"
#include "hashlib.h"
diff -r f4c6dab59cd8 Modules/signalmodule.c
--- a/Modules/signalmodule.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/signalmodule.c Wed Apr 27 20:47:18 2016 +0300
@@ -3,6 +3,8 @@
/* XXX Signals should be recorded per thread, now we have thread state. */
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#ifndef MS_WINDOWS
#include "posixmodule.h"
diff -r f4c6dab59cd8 Modules/socketmodule.c
--- a/Modules/socketmodule.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/socketmodule.c Wed Apr 27 20:47:18 2016 +0300
@@ -97,6 +97,8 @@ Local naming conventions:
# pragma weak inet_aton
#endif
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "structmember.h"
diff -r f4c6dab59cd8 Modules/spwdmodule.c
--- a/Modules/spwdmodule.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/spwdmodule.c Wed Apr 27 20:47:18 2016 +0300
@@ -3,6 +3,8 @@
/* A lot of code has been taken from pwdmodule.c */
/* For info also see http://www.unixpapa.com/incnote/passwd.html */
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include
diff -r f4c6dab59cd8 Modules/termios.c
--- a/Modules/termios.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/termios.c Wed Apr 27 20:47:18 2016 +0300
@@ -1,5 +1,7 @@
/* termiosmodule.c -- POSIX terminal I/O module implementation. */
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
/* Apparently, on SGI, termios.h won't define CTRL if _XOPEN_SOURCE
diff -r f4c6dab59cd8 Modules/timemodule.c
--- a/Modules/timemodule.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/timemodule.c Wed Apr 27 20:47:18 2016 +0300
@@ -1,5 +1,7 @@
/* Time module */
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include
diff -r f4c6dab59cd8 Modules/unicodedata.c
--- a/Modules/unicodedata.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/unicodedata.c Wed Apr 27 20:47:18 2016 +0300
@@ -14,6 +14,7 @@
------------------------------------------------------------------------ */
#define PY_SSIZE_T_CLEAN
+#define PY_MODULE_ADDOBJECT_CLEAN
#include "Python.h"
#include "ucnhash.h"
diff -r f4c6dab59cd8 Modules/xxlimited.c
--- a/Modules/xxlimited.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/xxlimited.c Wed Apr 27 20:47:18 2016 +0300
@@ -14,6 +14,8 @@
/* Xxo objects */
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
static PyObject *ErrorObject;
diff -r f4c6dab59cd8 Modules/xxmodule.c
--- a/Modules/xxmodule.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/xxmodule.c Wed Apr 27 20:47:18 2016 +0300
@@ -14,6 +14,8 @@
/* Xxo objects */
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
static PyObject *ErrorObject;
diff -r f4c6dab59cd8 Modules/xxsubtype.c
--- a/Modules/xxsubtype.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/xxsubtype.c Wed Apr 27 20:47:18 2016 +0300
@@ -1,3 +1,5 @@
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "structmember.h"
diff -r f4c6dab59cd8 Modules/zipimport.c
--- a/Modules/zipimport.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/zipimport.c Wed Apr 27 20:47:18 2016 +0300
@@ -1,3 +1,5 @@
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "structmember.h"
#include "osdefs.h"
diff -r f4c6dab59cd8 Modules/zlibmodule.c
--- a/Modules/zlibmodule.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Modules/zlibmodule.c Wed Apr 27 20:47:18 2016 +0300
@@ -4,6 +4,7 @@
/* Windows users: read Python's PCbuild\readme.txt */
#define PY_SSIZE_T_CLEAN
+#define PY_MODULE_ADDOBJECT_CLEAN
#include "Python.h"
#include "structmember.h"
diff -r f4c6dab59cd8 PC/_msi.c
--- a/PC/_msi.c Tue Apr 26 17:04:18 2016 +0200
+++ b/PC/_msi.c Wed Apr 27 20:47:18 2016 +0300
@@ -3,6 +3,8 @@
* Licensed to PSF under a contributor agreement.
*/
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include
#include
#include
diff -r f4c6dab59cd8 PC/msvcrtmodule.c
--- a/PC/msvcrtmodule.c Tue Apr 26 17:04:18 2016 +0200
+++ b/PC/msvcrtmodule.c Wed Apr 27 20:47:18 2016 +0300
@@ -16,6 +16,8 @@
***********************************************************/
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "malloc.h"
#include
diff -r f4c6dab59cd8 Python/_warnings.c
--- a/Python/_warnings.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Python/_warnings.c Wed Apr 27 20:47:18 2016 +0300
@@ -1,3 +1,5 @@
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
#include "frameobject.h"
diff -r f4c6dab59cd8 Python/importdl.c
--- a/Python/importdl.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Python/importdl.c Wed Apr 27 20:47:18 2016 +0300
@@ -1,6 +1,8 @@
/* Support for dynamic loading of extension modules */
+#define PY_MODULE_ADDOBJECT_CLEAN
+
#include "Python.h"
/* ./configure sets HAVE_DYNAMIC_LOADING if dynamic loading of modules is
@@ -206,10 +208,9 @@ PyObject *
def->m_base.m_init = p0;
/* Remember the filename as the __file__ attribute */
+ Py_INCREF(path);
if (PyModule_AddObject(m, "__file__", path) < 0)
PyErr_Clear(); /* Not important enough to report */
- else
- Py_INCREF(path);
if (_PyImport_FixupExtensionObject(m, name_unicode, path) < 0)
goto error;
diff -r f4c6dab59cd8 Python/modsupport.c
--- a/Python/modsupport.c Tue Apr 26 17:04:18 2016 +0200
+++ b/Python/modsupport.c Wed Apr 27 20:47:18 2016 +0300
@@ -517,8 +517,8 @@ PyEval_CallMethod(PyObject *obj, const c
return res;
}
-int
-PyModule_AddObject(PyObject *m, const char *name, PyObject *o)
+static int
+add_object(PyObject *m, const char *name, PyObject *o)
{
PyObject *dict;
if (!PyModule_Check(m)) {
@@ -542,20 +542,35 @@ PyModule_AddObject(PyObject *m, const ch
}
if (PyDict_SetItemString(dict, name, o))
return -1;
+ return 0;
+}
+
+#undef PyModule_AddObject
+
+int
+PyModule_AddObject(PyObject *m, const char *name, PyObject *o)
+{
+ if (add_object(m, name, o))
+ return -1;
Py_DECREF(o);
return 0;
}
int
+_PyModule_AddObject(PyObject *m, const char *name, PyObject *o)
+{
+ int res = add_object(m, name, o);
+ Py_DECREF(o);
+ return res;
+}
+
+int
PyModule_AddIntConstant(PyObject *m, const char *name, long value)
{
PyObject *o = PyLong_FromLong(value);
if (!o)
return -1;
- if (PyModule_AddObject(m, name, o) == 0)
- return 0;
- Py_DECREF(o);
- return -1;
+ return _PyModule_AddObject(m, name, o);
}
int
@@ -564,8 +579,5 @@ PyModule_AddStringConstant(PyObject *m,
PyObject *o = PyUnicode_FromString(value);
if (!o)
return -1;
- if (PyModule_AddObject(m, name, o) == 0)
- return 0;
- Py_DECREF(o);
- return -1;
+ return _PyModule_AddObject(m, name, o);
}