0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

updated for version 7.3.1069

Problem:    Python: memory leaks.
Solution:   Python patch 28: Purge out DICTKEY_CHECK_EMPTY macros. (ZyX)
This commit is contained in:
Bram Moolenaar
2013-05-30 14:52:37 +02:00
parent 018acca3bd
commit fc714b35c6
2 changed files with 30 additions and 20 deletions

View File

@@ -32,15 +32,8 @@ typedef int Py_ssize_t; /* Python 2.4 and earlier don't have this type. */
#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 (!(key = StringToChars(keyObject, &dictkey_todecref))) \
{ \
if (decref) \
{ \
@@ -50,7 +43,11 @@ typedef int Py_ssize_t; /* Python 2.4 and earlier don't have this type. */
} \
if (decref && !dictkey_todecref) \
dictkey_todecref = keyObject; \
DICTKEY_CHECK_EMPTY(err)
if (*key == NUL) \
{ \
PyErr_SetString(PyExc_ValueError, _("empty keys are not allowed")); \
return err; \
}
#define DICTKEY_UNREF \
Py_XDECREF(dictkey_todecref);
@@ -4551,7 +4548,7 @@ pydict_to_tv(PyObject *obj, typval_T *tv, PyObject *lookup_dict)
while (PyDict_Next(obj, &iter, &keyObject, &valObject))
{
DICTKEY_DECL
PyObject *todecref = NULL;
if (keyObject == NULL || valObject == NULL)
{
@@ -4559,16 +4556,21 @@ pydict_to_tv(PyObject *obj, typval_T *tv, PyObject *lookup_dict)
return -1;
}
if (!DICTKEY_SET_KEY)
if (!(key = StringToChars(keyObject, &todecref)))
{
dict_unref(dict);
return -1;
}
DICTKEY_CHECK_EMPTY(-1)
if (*key == NUL)
{
dict_unref(dict);
Py_XDECREF(todecref);
return -1;
}
di = dictitem_alloc(key);
DICTKEY_UNREF
Py_XDECREF(todecref);
if (di == NULL)
{
@@ -4632,31 +4634,37 @@ pymap_to_tv(PyObject *obj, typval_T *tv, PyObject *lookup_dict)
while ((keyObject = PyIter_Next(iterator)))
{
DICTKEY_DECL
PyObject *todecref;
if (!DICTKEY_SET_KEY)
if (!(key = StringToChars(keyObject, &todecref)))
{
Py_DECREF(keyObject);
Py_DECREF(iterator);
dict_unref(dict);
DICTKEY_UNREF
return -1;
}
DICTKEY_CHECK_EMPTY(-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);
DICTKEY_UNREF
return -1;
}
di = dictitem_alloc(key);
DICTKEY_UNREF
Py_DECREF(keyObject);
Py_XDECREF(todecref);
if (di == NULL)
{

View File

@@ -728,6 +728,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1069,
/**/
1068,
/**/