changeset 4643:6ec3dada4ad3 v7.3.1069

updated for version 7.3.1069 Problem: Python: memory leaks. Solution: Python patch 28: Purge out DICTKEY_CHECK_EMPTY macros. (ZyX)
author Bram Moolenaar <bram@vim.org>
date Thu, 30 May 2013 14:52:37 +0200
parents 539429c5fda2
children ac9b091fbd16
files src/if_py_both.h src/version.c
diffstat 2 files changed, 31 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/src/if_py_both.h
+++ b/src/if_py_both.h
@@ -32,15 +32,8 @@ typedef int Py_ssize_t;  /* Python 2.4 a
 
 #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 a
     } \
     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
 
     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
 	    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,
 
     while ((keyObject = PyIter_Next(iterator)))
     {
-	DICTKEY_DECL
-
-	if (!DICTKEY_SET_KEY)
+	PyObject	*todecref;
+
+	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)
 	{
--- a/src/version.c
+++ b/src/version.c
@@ -729,6 +729,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1069,
+/**/
     1068,
 /**/
     1067,