To: vim_dev@googlegroups.com Subject: Patch 7.3.1069 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.3.1069 Problem: Python: memory leaks. Solution: Python patch 28: Purge out DICTKEY_CHECK_EMPTY macros. (ZyX) Files: src/if_py_both.h *** ../vim-7.3.1068/src/if_py_both.h 2013-05-30 13:37:23.000000000 +0200 --- src/if_py_both.h 2013-05-30 14:50:11.000000000 +0200 *************** *** 32,46 **** #define DICTKEY_DECL \ PyObject *dictkey_todecref = NULL; - #define DICTKEY_CHECK_EMPTY(err) \ - if (*key == NUL) \ - { \ - PyErr_SetString(PyExc_ValueError, _("empty keys are not allowed")); \ - return err; \ - } - #define DICTKEY_SET_KEY (key = StringToChars(keyObject, &dictkey_todecref)) #define DICTKEY_GET(err, decref) \ ! if (!DICTKEY_SET_KEY) \ { \ if (decref) \ { \ --- 32,39 ---- #define DICTKEY_DECL \ PyObject *dictkey_todecref = NULL; #define DICTKEY_GET(err, decref) \ ! if (!(key = StringToChars(keyObject, &dictkey_todecref))) \ { \ if (decref) \ { \ *************** *** 50,56 **** } \ if (decref && !dictkey_todecref) \ dictkey_todecref = keyObject; \ ! DICTKEY_CHECK_EMPTY(err) #define DICTKEY_UNREF \ Py_XDECREF(dictkey_todecref); --- 43,53 ---- } \ if (decref && !dictkey_todecref) \ dictkey_todecref = keyObject; \ ! if (*key == NUL) \ ! { \ ! PyErr_SetString(PyExc_ValueError, _("empty keys are not allowed")); \ ! return err; \ ! } #define DICTKEY_UNREF \ Py_XDECREF(dictkey_todecref); *************** *** 4551,4557 **** while (PyDict_Next(obj, &iter, &keyObject, &valObject)) { ! DICTKEY_DECL if (keyObject == NULL || valObject == NULL) { --- 4548,4554 ---- while (PyDict_Next(obj, &iter, &keyObject, &valObject)) { ! PyObject *todecref = NULL; if (keyObject == NULL || valObject == NULL) { *************** *** 4559,4574 **** return -1; } ! if (!DICTKEY_SET_KEY) { dict_unref(dict); return -1; } - DICTKEY_CHECK_EMPTY(-1) di = dictitem_alloc(key); ! DICTKEY_UNREF if (di == NULL) { --- 4556,4576 ---- return -1; } ! if (!(key = StringToChars(keyObject, &todecref))) ! { ! dict_unref(dict); ! return -1; ! } ! if (*key == NUL) { dict_unref(dict); + Py_XDECREF(todecref); return -1; } di = dictitem_alloc(key); ! Py_XDECREF(todecref); if (di == NULL) { *************** *** 4632,4662 **** while ((keyObject = PyIter_Next(iterator))) { ! DICTKEY_DECL ! if (!DICTKEY_SET_KEY) { Py_DECREF(iterator); dict_unref(dict); - DICTKEY_UNREF return -1; } ! DICTKEY_CHECK_EMPTY(-1) if (!(valObject = PyObject_GetItem(obj, keyObject))) { Py_DECREF(keyObject); Py_DECREF(iterator); dict_unref(dict); - DICTKEY_UNREF return -1; } di = dictitem_alloc(key); - DICTKEY_UNREF - Py_DECREF(keyObject); if (di == NULL) { --- 4634,4670 ---- while ((keyObject = PyIter_Next(iterator))) { ! PyObject *todecref; ! if (!(key = StringToChars(keyObject, &todecref))) { + Py_DECREF(keyObject); Py_DECREF(iterator); dict_unref(dict); return -1; } ! if (*key == NUL) ! { ! Py_DECREF(keyObject); ! Py_DECREF(iterator); ! Py_XDECREF(todecref); ! dict_unref(dict); ! return -1; ! } if (!(valObject = PyObject_GetItem(obj, keyObject))) { Py_DECREF(keyObject); Py_DECREF(iterator); + Py_XDECREF(todecref); dict_unref(dict); return -1; } di = dictitem_alloc(key); Py_DECREF(keyObject); + Py_XDECREF(todecref); if (di == NULL) { *** ../vim-7.3.1068/src/version.c 2013-05-30 13:37:23.000000000 +0200 --- src/version.c 2013-05-30 13:38:46.000000000 +0200 *************** *** 730,731 **** --- 730,733 ---- { /* Add new patch number below this line */ + /**/ + 1069, /**/ -- How To Keep A Healthy Level Of Insanity: 11. Specify that your drive-through order is "to go". /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///