Blob Blame History Raw
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


*** ../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    ///