diff options
author | Bram Moolenaar <Bram@vim.org> | 2013-06-02 17:41:54 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2013-06-02 17:41:54 +0200 |
commit | de71b5658f780e1fac29b1ef8b58af3dd42e65ad (patch) | |
tree | cdcf529e0fca413b18415513673940763cbd9460 | |
parent | 525666f28201c313825065d49b98606c8cade457 (diff) | |
download | vim-git-de71b5658f780e1fac29b1ef8b58af3dd42e65ad.tar.gz |
updated for version 7.3.1096v7.3.1096
Problem: Python: popitem() was not defined in a standard way.
Solution: Remove the argument from popitem(). (ZyX)
-rw-r--r-- | runtime/doc/if_pyth.txt | 11 | ||||
-rw-r--r-- | src/if_py_both.h | 46 | ||||
-rw-r--r-- | src/testdir/test86.in | 4 | ||||
-rw-r--r-- | src/testdir/test86.ok | 4 | ||||
-rw-r--r-- | src/testdir/test87.in | 4 | ||||
-rw-r--r-- | src/testdir/test87.ok | 4 | ||||
-rw-r--r-- | src/version.c | 2 |
7 files changed, 44 insertions, 31 deletions
diff --git a/runtime/doc/if_pyth.txt b/runtime/doc/if_pyth.txt index fffc4c789..b8073cf5f 100644 --- a/runtime/doc/if_pyth.txt +++ b/runtime/doc/if_pyth.txt @@ -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`. diff --git a/src/if_py_both.h b/src/if_py_both.h index 4c80d2e30..eedbf1ca2 100644 --- a/src/if_py_both.h +++ b/src/if_py_both.h @@ -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} diff --git a/src/testdir/test86.in b/src/testdir/test86.in index 8569e4241..dc21af493 100644 --- a/src/testdir/test86.in +++ b/src/testdir/test86.in @@ -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 diff --git a/src/testdir/test86.ok b/src/testdir/test86.ok index a98b4459a..7d243904e 100644 --- a/src/testdir/test86.ok +++ b/src/testdir/test86.ok @@ -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 diff --git a/src/testdir/test87.in b/src/testdir/test87.in index 395fb19b6..45a4b8e40 100644 --- a/src/testdir/test87.in +++ b/src/testdir/test87.in @@ -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 diff --git a/src/testdir/test87.ok b/src/testdir/test87.ok index 569d13f1e..94a914ef8 100644 --- a/src/testdir/test87.ok +++ b/src/testdir/test87.ok @@ -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 diff --git a/src/version.c b/src/version.c index 444b41c3d..a9f794d48 100644 --- a/src/version.c +++ b/src/version.c @@ -729,6 +729,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1096, +/**/ 1095, /**/ 1094, |