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 -- [email protected] -- 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    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Raspunde prin e-mail lui