| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.1069 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| 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 |
| |
| |
| |
| |
| |
| *** 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) |
| { |
| |
| |
| |
| *** 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 /// |