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); }