[vim] - patchlevel 1077

Karsten Hopp karsten at fedoraproject.org
Tue Jun 4 10:13:36 UTC 2013


commit 52e1e875fc57e0079acaf859e1cfa8397bf45ff3
Author: Karsten Hopp <karsten at redhat.com>
Date:   Tue Jun 4 12:06:40 2013 +0200

    - patchlevel 1077

 7.3.1077 |  462 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 462 insertions(+), 0 deletions(-)
---
diff --git a/7.3.1077 b/7.3.1077
new file mode 100644
index 0000000..3006835
--- /dev/null
+++ b/7.3.1077
@@ -0,0 +1,462 @@
+To: vim_dev at googlegroups.com
+Subject: Patch 7.3.1077
+Fcc: outbox
+From: Bram Moolenaar <Bram at moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.3.1077
+Problem:    Python: Allocating dict the wrong way, causing a crash.
+Solution:   Use py_dict_alloc(). Fix some exception problems. (ZyX)
+Files:	    src/if_py_both.h
+
+
+*** ../vim-7.3.1076/src/if_py_both.h	2013-05-30 19:01:20.000000000 +0200
+--- src/if_py_both.h	2013-05-30 21:53:00.000000000 +0200
+***************
+*** 26,56 ****
+  
+  #define PyErr_SetVim(str) PyErr_SetString(VimError, str)
+  
+  #define INVALID_BUFFER_VALUE ((buf_T *)(-1))
+  #define INVALID_WINDOW_VALUE ((win_T *)(-1))
+  #define INVALID_TABPAGE_VALUE ((tabpage_T *)(-1))
+  
+- #define DICTKEY_DECL \
+-     PyObject	*dictkey_todecref = NULL;
+- #define DICTKEY_GET(err, decref) \
+-     if (!(key = StringToChars(keyObject, &dictkey_todecref))) \
+-     { \
+- 	if (decref) \
+- 	{ \
+- 	    Py_DECREF(keyObject); \
+- 	} \
+- 	return err; \
+-     } \
+-     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);
+- 
+  typedef void (*rangeinitializer)(void *);
+  typedef void (*runner)(const char *, void *
+  #ifdef PY_CAN_RECURSE
+--- 26,38 ----
+  
+  #define PyErr_SetVim(str) PyErr_SetString(VimError, str)
+  
++ #define RAISE_NO_EMPTY_KEYS PyErr_SetString(PyExc_ValueError, \
++ 						_("empty keys are not allowed"))
++ 
+  #define INVALID_BUFFER_VALUE ((buf_T *)(-1))
+  #define INVALID_WINDOW_VALUE ((win_T *)(-1))
+  #define INVALID_TABPAGE_VALUE ((tabpage_T *)(-1))
+  
+  typedef void (*rangeinitializer)(void *);
+  typedef void (*runner)(const char *, void *
+  #ifdef PY_CAN_RECURSE
+***************
+*** 1016,1023 ****
+      dictitem_T	*di;
+      dict_T	*dict = self->dict;
+      hashitem_T	*hi;
+! 
+!     DICTKEY_DECL
+  
+      if (flags & DICT_FLAG_HAS_DEFAULT)
+      {
+--- 998,1004 ----
+      dictitem_T	*di;
+      dict_T	*dict = self->dict;
+      hashitem_T	*hi;
+!     PyObject	*todecref;
+  
+      if (flags & DICT_FLAG_HAS_DEFAULT)
+      {
+***************
+*** 1030,1040 ****
+      if (flags & DICT_FLAG_RETURN_BOOL)
+  	defObject = Py_False;
+  
+!     DICTKEY_GET(NULL, 0)
+  
+      hi = hash_find(&dict->dv_hashtab, key);
+  
+!     DICTKEY_UNREF
+  
+      if (HASHITEM_EMPTY(hi))
+      {
+--- 1011,1028 ----
+      if (flags & DICT_FLAG_RETURN_BOOL)
+  	defObject = Py_False;
+  
+!     if (!(key = StringToChars(keyObject, &todecref)))
+! 	return NULL;
+! 
+!     if (*key == NUL)
+!     {
+! 	RAISE_NO_EMPTY_KEYS;
+! 	return NULL;
+!     }
+  
+      hi = hash_find(&dict->dv_hashtab, key);
+  
+!     Py_XDECREF(todecref);
+  
+      if (HASHITEM_EMPTY(hi))
+      {
+***************
+*** 1173,1179 ****
+      typval_T	tv;
+      dict_T	*dict = self->dict;
+      dictitem_T	*di;
+!     DICTKEY_DECL
+  
+      if (dict->dv_lock)
+      {
+--- 1161,1167 ----
+      typval_T	tv;
+      dict_T	*dict = self->dict;
+      dictitem_T	*di;
+!     PyObject	*todecref;
+  
+      if (dict->dv_lock)
+      {
+***************
+*** 1181,1187 ****
+  	return -1;
+      }
+  
+!     DICTKEY_GET(-1, 0)
+  
+      di = dict_find(dict, key, -1);
+  
+--- 1169,1181 ----
+  	return -1;
+      }
+  
+!     if (!(key = StringToChars(keyObject, &todecref)))
+! 	return -1;
+!     if (*key == NUL)
+!     {
+! 	RAISE_NO_EMPTY_KEYS;
+! 	return -1;
+!     }
+  
+      di = dict_find(dict, key, -1);
+  
+***************
+*** 1191,1197 ****
+  
+  	if (di == NULL)
+  	{
+! 	    DICTKEY_UNREF
+  	    PyErr_SetObject(PyExc_KeyError, keyObject);
+  	    return -1;
+  	}
+--- 1185,1191 ----
+  
+  	if (di == NULL)
+  	{
+! 	    Py_XDECREF(todecref);
+  	    PyErr_SetObject(PyExc_KeyError, keyObject);
+  	    return -1;
+  	}
+***************
+*** 1208,1213 ****
+--- 1202,1208 ----
+      {
+  	if (!(di = dictitem_alloc(key)))
+  	{
++ 	    Py_XDECREF(todecref);
+  	    PyErr_NoMemory();
+  	    return -1;
+  	}
+***************
+*** 1216,1222 ****
+  
+  	if (dict_add(dict, di) == FAIL)
+  	{
+! 	    DICTKEY_UNREF
+  	    vim_free(di);
+  	    dictitem_free(di);
+  	    PyErr_SetVim(_("failed to add key to dictionary"));
+--- 1211,1217 ----
+  
+  	if (dict_add(dict, di) == FAIL)
+  	{
+! 	    Py_XDECREF(todecref);
+  	    vim_free(di);
+  	    dictitem_free(di);
+  	    PyErr_SetVim(_("failed to add key to dictionary"));
+***************
+*** 1226,1232 ****
+      else
+  	clear_tv(&di->di_tv);
+  
+!     DICTKEY_UNREF
+  
+      copy_tv(&tv, &di->di_tv);
+      clear_tv(&tv);
+--- 1221,1227 ----
+      else
+  	clear_tv(&di->di_tv);
+  
+!     Py_XDECREF(todecref);
+  
+      copy_tv(&tv, &di->di_tv);
+      clear_tv(&tv);
+***************
+*** 2202,2218 ****
+      int		flags;
+      long	numval;
+      char_u	*stringval;
+!     DICTKEY_DECL
+  
+      if (self->Check(self->from))
+  	return NULL;
+  
+!     DICTKEY_GET(NULL, 0)
+  
+      flags = get_option_value_strict(key, &numval, &stringval,
+  				    self->opt_type, self->from);
+  
+!     DICTKEY_UNREF
+  
+      if (flags == 0)
+      {
+--- 2197,2219 ----
+      int		flags;
+      long	numval;
+      char_u	*stringval;
+!     PyObject	*todecref;
+  
+      if (self->Check(self->from))
+  	return NULL;
+  
+!     if (!(key = StringToChars(keyObject, &todecref)))
+! 	return NULL;
+!     if (*key == NUL)
+!     {
+! 	RAISE_NO_EMPTY_KEYS;
+! 	return NULL;
+!     }
+  
+      flags = get_option_value_strict(key, &numval, &stringval,
+  				    self->opt_type, self->from);
+  
+!     Py_XDECREF(todecref);
+  
+      if (flags == 0)
+      {
+***************
+*** 2329,2340 ****
+      int		flags;
+      int		opt_flags;
+      int		r = 0;
+!     DICTKEY_DECL
+  
+      if (self->Check(self->from))
+  	return -1;
+  
+!     DICTKEY_GET(-1, 0)
+  
+      flags = get_option_value_strict(key, NULL, NULL,
+  				    self->opt_type, self->from);
+--- 2330,2347 ----
+      int		flags;
+      int		opt_flags;
+      int		r = 0;
+!     PyObject	*todecref;
+  
+      if (self->Check(self->from))
+  	return -1;
+  
+!     if (!(key = StringToChars(keyObject, &todecref)))
+! 	return -1;
+!     if (*key == NUL)
+!     {
+! 	RAISE_NO_EMPTY_KEYS;
+! 	return -1;
+!     }
+  
+      flags = get_option_value_strict(key, NULL, NULL,
+  				    self->opt_type, self->from);
+***************
+*** 2342,2348 ****
+      if (flags == 0)
+      {
+  	PyErr_SetObject(PyExc_KeyError, keyObject);
+! 	DICTKEY_UNREF
+  	return -1;
+      }
+  
+--- 2349,2355 ----
+      if (flags == 0)
+      {
+  	PyErr_SetObject(PyExc_KeyError, keyObject);
+! 	Py_XDECREF(todecref);
+  	return -1;
+      }
+  
+***************
+*** 2352,2371 ****
+  	{
+  	    PyErr_SetString(PyExc_ValueError,
+  		    _("unable to unset global option"));
+! 	    DICTKEY_UNREF
+  	    return -1;
+  	}
+  	else if (!(flags & SOPT_GLOBAL))
+  	{
+  	    PyErr_SetString(PyExc_ValueError, _("unable to unset option "
+  						"without global value"));
+! 	    DICTKEY_UNREF
+  	    return -1;
+  	}
+  	else
+  	{
+  	    unset_global_local_option(key, self->from);
+! 	    DICTKEY_UNREF
+  	    return 0;
+  	}
+      }
+--- 2359,2378 ----
+  	{
+  	    PyErr_SetString(PyExc_ValueError,
+  		    _("unable to unset global option"));
+! 	    Py_XDECREF(todecref);
+  	    return -1;
+  	}
+  	else if (!(flags & SOPT_GLOBAL))
+  	{
+  	    PyErr_SetString(PyExc_ValueError, _("unable to unset option "
+  						"without global value"));
+! 	    Py_XDECREF(todecref);
+  	    return -1;
+  	}
+  	else
+  	{
+  	    unset_global_local_option(key, self->from);
+! 	    Py_XDECREF(todecref);
+  	    return 0;
+  	}
+      }
+***************
+*** 2396,2402 ****
+  	else
+  	{
+  	    PyErr_SetString(PyExc_TypeError, _("object must be integer"));
+! 	    DICTKEY_UNREF
+  	    return -1;
+  	}
+  
+--- 2403,2409 ----
+  	else
+  	{
+  	    PyErr_SetString(PyExc_TypeError, _("object must be integer"));
+! 	    Py_XDECREF(todecref);
+  	    return -1;
+  	}
+  
+***************
+*** 2418,2424 ****
+  	    r = -1;
+      }
+  
+!     DICTKEY_UNREF
+  
+      return r;
+  }
+--- 2425,2431 ----
+  	    r = -1;
+      }
+  
+!     Py_XDECREF(todecref);
+  
+      return r;
+  }
+***************
+*** 4528,4534 ****
+      PyObject	*valObject;
+      Py_ssize_t	iter = 0;
+  
+!     if (!(dict = dict_alloc()))
+  	return -1;
+  
+      tv->v_type = VAR_DICT;
+--- 4535,4541 ----
+      PyObject	*valObject;
+      Py_ssize_t	iter = 0;
+  
+!     if (!(dict = py_dict_alloc()))
+  	return -1;
+  
+      tv->v_type = VAR_DICT;
+***************
+*** 4553,4558 ****
+--- 4560,4566 ----
+  	{
+  	    dict_unref(dict);
+  	    Py_XDECREF(todecref);
++ 	    RAISE_NO_EMPTY_KEYS;
+  	    return -1;
+  	}
+  
+***************
+*** 4600,4606 ****
+      PyObject	*keyObject;
+      PyObject	*valObject;
+  
+!     if (!(dict = dict_alloc()))
+  	return -1;
+  
+      tv->v_type = VAR_DICT;
+--- 4608,4614 ----
+      PyObject	*keyObject;
+      PyObject	*valObject;
+  
+!     if (!(dict = py_dict_alloc()))
+  	return -1;
+  
+      tv->v_type = VAR_DICT;
+***************
+*** 4637,4642 ****
+--- 4645,4651 ----
+  	    Py_DECREF(iterator);
+  	    Py_XDECREF(todecref);
+  	    dict_unref(dict);
++ 	    RAISE_NO_EMPTY_KEYS;
+  	    return -1;
+  	}
+  
+*** ../vim-7.3.1076/src/version.c	2013-05-30 21:42:09.000000000 +0200
+--- src/version.c	2013-05-30 21:49:50.000000000 +0200
+***************
+*** 730,731 ****
+--- 730,733 ----
+  {   /* Add new patch number below this line */
++ /**/
++     1077,
+  /**/
+
+-- 
+The History of every major Galactic Civilization tends to pass through
+three distinct and recognizable phases, those of Survival, Inquiry and
+Sophistication, otherwise known as the How, Why and Where phases.
+For instance, the first phase is characterized by the question 'How can
+we eat?' the second by the question 'Why do we eat?' and the third by
+the question 'Where shall we have lunch?'
+		-- Douglas Adams, "The Hitchhiker's Guide to the Galaxy"
+
+ /// Bram Moolenaar -- Bram at 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    ///


More information about the scm-commits mailing list