# HG changeset patch
# User ZyX <kp-...@ya.ru>
# Date 1346508509 -14400
# Node ID 0fa6134265ec58e8dba97cdb8e2a6730e05361df
# Parent  744a019963bcce46daa52f8dc61c79415c47bf45
Do not allow empty keys when creating vim dictionaries from python objects
Throw IndexError when dictionary item was not found, not vim.error

diff -r 744a019963bc -r 0fa6134265ec src/if_py_both.h
--- a/src/if_py_both.h  Sat Sep 01 17:51:34 2012 +0400
+++ b/src/if_py_both.h  Sat Sep 01 18:08:04 2012 +0400
@@ -612,6 +612,14 @@
 
 static PyTypeObject DictionaryType;
 
+#define DICTKEY_GET_NOTEMPTY(err) \
+    DICTKEY_GET(err) \
+    if (*key == NUL) \
+    { \
+       PyErr_SetString(PyExc_ValueError, _("empty keys are not allowed")); \
+       return err; \
+    }
+
 typedef struct
 {
     PyObject_HEAD
@@ -664,7 +672,7 @@
        if (valObject == NULL)
            return -1;
 
-       DICTKEY_GET(-1)
+       DICTKEY_GET_NOTEMPTY(-1)
 
        di = dictitem_alloc(key);
 
@@ -735,7 +743,7 @@
            return -1;
        }
 
-       DICTKEY_GET(-1)
+       DICTKEY_GET_NOTEMPTY(-1)
 
        valObject = PyTuple_GetItem(litem, 1);
        if (valObject == NULL)
@@ -789,16 +797,22 @@
 DictionaryItem(PyObject *self, PyObject *keyObject)
 {
     char_u     *key;
-    dictitem_T *val;
+    dictitem_T *di;
     DICTKEY_DECL
 
-    DICTKEY_GET(NULL)
-
-    val = dict_find(((DictionaryObject *) (self))->dict, key, -1);
+    DICTKEY_GET_NOTEMPTY(NULL)
+
+    di = dict_find(((DictionaryObject *) (self))->dict, key, -1);
+
+    if (di == NULL)
+    {
+       PyErr_SetString(PyExc_IndexError, _("no such key in dictionary"));
+       return NULL;
+    }
 
     DICTKEY_UNREF
 
-    return ConvertToPyObject(&val->di_tv);
+    return ConvertToPyObject(&di->di_tv);
 }
 
     static PyInt
@@ -816,7 +830,7 @@
        return -1;
     }
 
-    DICTKEY_GET(-1)
+    DICTKEY_GET_NOTEMPTY(-1)
 
     di = dict_find(d, key, -1);
 

-- 
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

Raspunde prin e-mail lui