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:
@@ -32,15 +32,8 @@ typedef int Py_ssize_t; /* Python 2.4 and earlier don't have this type. */
|
|||||||
|
|
||||||
#define DICTKEY_DECL \
|
#define DICTKEY_DECL \
|
||||||
PyObject *dictkey_todecref = NULL;
|
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) \
|
#define DICTKEY_GET(err, decref) \
|
||||||
if (!DICTKEY_SET_KEY) \
|
if (!(key = StringToChars(keyObject, &dictkey_todecref))) \
|
||||||
{ \
|
{ \
|
||||||
if (decref) \
|
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) \
|
if (decref && !dictkey_todecref) \
|
||||||
dictkey_todecref = keyObject; \
|
dictkey_todecref = keyObject; \
|
||||||
DICTKEY_CHECK_EMPTY(err)
|
if (*key == NUL) \
|
||||||
|
{ \
|
||||||
|
PyErr_SetString(PyExc_ValueError, _("empty keys are not allowed")); \
|
||||||
|
return err; \
|
||||||
|
}
|
||||||
#define DICTKEY_UNREF \
|
#define DICTKEY_UNREF \
|
||||||
Py_XDECREF(dictkey_todecref);
|
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))
|
while (PyDict_Next(obj, &iter, &keyObject, &valObject))
|
||||||
{
|
{
|
||||||
DICTKEY_DECL
|
PyObject *todecref = NULL;
|
||||||
|
|
||||||
if (keyObject == NULL || valObject == NULL)
|
if (keyObject == NULL || valObject == NULL)
|
||||||
{
|
{
|
||||||
@@ -4559,16 +4556,21 @@ pydict_to_tv(PyObject *obj, typval_T *tv, PyObject *lookup_dict)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!DICTKEY_SET_KEY)
|
if (!(key = StringToChars(keyObject, &todecref)))
|
||||||
{
|
{
|
||||||
dict_unref(dict);
|
dict_unref(dict);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
DICTKEY_CHECK_EMPTY(-1)
|
if (*key == NUL)
|
||||||
|
{
|
||||||
|
dict_unref(dict);
|
||||||
|
Py_XDECREF(todecref);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
di = dictitem_alloc(key);
|
di = dictitem_alloc(key);
|
||||||
|
|
||||||
DICTKEY_UNREF
|
Py_XDECREF(todecref);
|
||||||
|
|
||||||
if (di == NULL)
|
if (di == NULL)
|
||||||
{
|
{
|
||||||
@@ -4632,31 +4634,37 @@ pymap_to_tv(PyObject *obj, typval_T *tv, PyObject *lookup_dict)
|
|||||||
|
|
||||||
while ((keyObject = PyIter_Next(iterator)))
|
while ((keyObject = PyIter_Next(iterator)))
|
||||||
{
|
{
|
||||||
DICTKEY_DECL
|
PyObject *todecref;
|
||||||
|
|
||||||
if (!DICTKEY_SET_KEY)
|
if (!(key = StringToChars(keyObject, &todecref)))
|
||||||
{
|
{
|
||||||
|
Py_DECREF(keyObject);
|
||||||
Py_DECREF(iterator);
|
Py_DECREF(iterator);
|
||||||
dict_unref(dict);
|
dict_unref(dict);
|
||||||
DICTKEY_UNREF
|
|
||||||
return -1;
|
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)))
|
if (!(valObject = PyObject_GetItem(obj, keyObject)))
|
||||||
{
|
{
|
||||||
Py_DECREF(keyObject);
|
Py_DECREF(keyObject);
|
||||||
Py_DECREF(iterator);
|
Py_DECREF(iterator);
|
||||||
|
Py_XDECREF(todecref);
|
||||||
dict_unref(dict);
|
dict_unref(dict);
|
||||||
DICTKEY_UNREF
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
di = dictitem_alloc(key);
|
di = dictitem_alloc(key);
|
||||||
|
|
||||||
DICTKEY_UNREF
|
|
||||||
|
|
||||||
Py_DECREF(keyObject);
|
Py_DECREF(keyObject);
|
||||||
|
Py_XDECREF(todecref);
|
||||||
|
|
||||||
if (di == NULL)
|
if (di == NULL)
|
||||||
{
|
{
|
||||||
|
@@ -728,6 +728,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1069,
|
||||||
/**/
|
/**/
|
||||||
1068,
|
1068,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user