]> granicus.if.org Git - vim/commitdiff
updated for version 7.3.1096 v7.3.1096
authorBram Moolenaar <Bram@vim.org>
Sun, 2 Jun 2013 15:41:54 +0000 (17:41 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 2 Jun 2013 15:41:54 +0000 (17:41 +0200)
Problem:    Python: popitem() was not defined in a standard way.
Solution:   Remove the argument from popitem(). (ZyX)

runtime/doc/if_pyth.txt
src/if_py_both.h
src/testdir/test86.in
src/testdir/test86.ok
src/testdir/test87.in
src/testdir/test87.ok
src/version.c

index fffc4c7898a1c5239ee5dca7b03fddfeb6180b2f..b8073cf5fe174507ea411ba9b77ca6814744e293 100644 (file)
@@ -174,7 +174,7 @@ vim.eval(str)                                               *python-eval*
 vim.bindeval(str)                                      *python-bindeval*
        Like |python-eval|, but returns special objects described in 
        |python-bindeval-objects|. These python objects let you modify (|List| 
-       or |Dictionary|) or call (|Funcref|) vim objecs.
+       or |Dictionary|) or call (|Funcref|) vim objects.
 
 Error object of the "vim" module
 
@@ -208,7 +208,7 @@ vim.windows                                         *python-windows*
            :py w in vim.windows        # Membership test
            :py n = len(vim.windows)    # Number of elements
            :py for w in vim.windows:   # Sequential access
-<      Note: vim.windows object always accesses current tab page,
+<      Note: vim.windows object always accesses current tab page. 
        |python-tabpage|.windows objects are bound to parent |python-tabpage| 
        object and always use windows from that tab page (or throw vim.error 
        in case tab page was deleted). You can keep a reference to both 
@@ -494,10 +494,9 @@ vim.Dictionary object                              *python-Dictionary*
                     Remove specified key from dictionary and return 
                     corresponding value. If key is not found and default is 
                     given returns the default, otherwise raises KeyError.
-        popitem(key)
-                    Remove specified key from dictionary and return a pair 
-                    with it and the corresponding value. Returned key is a new 
-                    object.
+        popitem()
+                    Remove random key from dictionary and return (key, value) 
+                    pair.
         has_key(key)
                     Check whether dictionary contains specified key, similar 
                     to `key in dict`.
index 4c80d2e30fa152d28e3966e9ba19398a73fb1d24..eedbf1ca2d3c8e349613fb07e571f695ba76678f 100644 (file)
@@ -1061,17 +1061,6 @@ _DictionaryItem(DictionaryObject *self, PyObject *args, int flags)
        dictitem_free(di);
     }
 
-    if (flags & DICT_FLAG_RETURN_PAIR)
-    {
-       PyObject        *tmp = r;
-
-       if (!(r = Py_BuildValue("(" Py_bytes_fmt "O)", hi->hi_key, tmp)))
-       {
-           Py_DECREF(tmp);
-           return NULL;
-       }
-    }
-
     return r;
 }
 
@@ -1457,15 +1446,38 @@ DictionaryPop(DictionaryObject *self, PyObject *args)
 }
 
     static PyObject *
-DictionaryPopItem(DictionaryObject *self, PyObject *args)
+DictionaryPopItem(DictionaryObject *self)
 {
-    PyObject   *keyObject;
+    hashitem_T *hi;
+    PyObject   *r;
+    PyObject   *valObject;
+    dictitem_T *di;
 
-    if (!PyArg_ParseTuple(args, "O", &keyObject))
+    if (self->dict->dv_hashtab.ht_used == 0)
+    {
+       PyErr_SetNone(PyExc_KeyError);
        return NULL;
+    }
+
+    hi = self->dict->dv_hashtab.ht_array;
+    while (HASHITEM_EMPTY(hi))
+       ++hi;
+
+    di = dict_lookup(hi);
 
-    return _DictionaryItem(self, keyObject,
-                           DICT_FLAG_POP|DICT_FLAG_RETURN_PAIR);
+    if (!(valObject = ConvertToPyObject(&di->di_tv)))
+       return NULL;
+
+    if (!(r = Py_BuildValue("(" Py_bytes_fmt "O)", hi->hi_key, valObject)))
+    {
+       Py_DECREF(valObject);
+       return NULL;
+    }
+
+    hash_remove(&self->dict->dv_hashtab, hi);
+    dictitem_free(di);
+
+    return r;
 }
 
     static PyObject *
@@ -1505,7 +1517,7 @@ static struct PyMethodDef DictionaryMethods[] = {
     {"update", (PyCFunction)DictionaryUpdate,          METH_VARARGS|METH_KEYWORDS, ""},
     {"get",    (PyCFunction)DictionaryGet,             METH_VARARGS,   ""},
     {"pop",    (PyCFunction)DictionaryPop,             METH_VARARGS,   ""},
-    {"popitem",        (PyCFunction)DictionaryPopItem,         METH_VARARGS,   ""},
+    {"popitem",        (PyCFunction)DictionaryPopItem,         METH_NOARGS,    ""},
     {"has_key",        (PyCFunction)DictionaryHasKey,          METH_VARARGS,   ""},
     {"__dir__",        (PyCFunction)DictionaryDir,             METH_NOARGS,    ""},
     { NULL,    NULL,                                   0,              NULL}
index 8569e4241067d5756d0b70af3504783ce7525738..dc21af493e33dc571464b970ce213e30251fce48 100644 (file)
@@ -83,7 +83,7 @@ EOF
 :$put =pyeval('repr(''1'' in d)')
 :$put =pyeval('repr(list(iter(d)))')
 :$put =string(d)
-:$put =pyeval('repr(d.popitem(''0''))')
+:$put =pyeval('repr(d.popitem())')
 :$put =pyeval('repr(d.get(''0''))')
 :$put =pyeval('repr(list(iter(d)))')
 :"
@@ -226,7 +226,7 @@ em('d["a\\0b"]=1')
 em('d[u"a\\0b"]=1')
 
 em('d.pop("abc")')
-em('d.popitem("abc")')
+em('d.popitem()')
 EOF
 :$put =messages
 :unlet messages
index a98b4459a2e2b1d4521bc973213e312233f9037a..7d243904e2eb78abd4634232236f02fd4306f8ec 100644 (file)
@@ -26,7 +26,7 @@ True
 False
 ['0']
 {'0': -1}
-('', -1L)
+('0', -1L)
 None
 []
 [0, 1, 2, 3]
@@ -666,7 +666,7 @@ d.update((("a", FailingMapping()),)):(<type 'exceptions.NotImplementedError'>, N
 d.update((("a", FailingMappingKey()),)):(<type 'exceptions.NotImplementedError'>, NotImplementedError())
 <<< Finished
 >> DictionaryPopItem
-d.popitem(1, 2):(<type 'exceptions.TypeError'>, TypeError('function takes exactly 1 argument (2 given)',))
+d.popitem(1, 2):(<type 'exceptions.TypeError'>, TypeError('popitem() takes no arguments (2 given)',))
 >> DictionaryHasKey
 d.has_key():(<type 'exceptions.TypeError'>, TypeError('function takes exactly 1 argument (0 given)',))
 > List
index 395fb19b6faf77d13dc084500f224ff8545edf34..45a4b8e40107320553f196e9edef75a82921e280 100644 (file)
@@ -77,7 +77,7 @@ EOF
 :$put =py3eval('repr(''1'' in d)')
 :$put =py3eval('repr(list(iter(d)))')
 :$put =string(d)
-:$put =py3eval('repr(d.popitem(''0''))')
+:$put =py3eval('repr(d.popitem())')
 :$put =py3eval('repr(d.get(''0''))')
 :$put =py3eval('repr(list(iter(d)))')
 :"
@@ -220,7 +220,7 @@ em('d["a\\0b"]=1')
 em('d[b"a\\0b"]=1')
 
 em('d.pop("abc")')
-em('d.popitem("abc")')
+em('d.popitem()')
 EOF
 :$put =messages
 :unlet messages
index 569d13f1efc28a4151d20cd5cc98d8fe57aaa326..94a914ef85ac4566f7a83ed83fd75b27ccd219fe 100644 (file)
@@ -26,7 +26,7 @@ True
 False
 [b'0']
 {'0': -1}
-(b'', -1)
+(b'0', -1)
 None
 []
 [0, 1, 2, 3]
@@ -663,7 +663,7 @@ d.update((("a", FailingMapping()),)):(<class 'NotImplementedError'>, NotImplemen
 d.update((("a", FailingMappingKey()),)):(<class 'NotImplementedError'>, NotImplementedError())
 <<< Finished
 >> DictionaryPopItem
-d.popitem(1, 2):(<class 'TypeError'>, TypeError('function takes exactly 1 argument (2 given)',))
+d.popitem(1, 2):(<class 'TypeError'>, TypeError('popitem() takes no arguments (2 given)',))
 >> DictionaryHasKey
 d.has_key():(<class 'TypeError'>, TypeError('function takes exactly 1 argument (0 given)',))
 > List
index 444b41c3d0421cbe369cbebe3313192187ee693d..a9f794d48b680c568a4ab365abd3e5ac94a3bce7 100644 (file)
@@ -728,6 +728,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1096,
 /**/
     1095,
 /**/