summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2013-06-02 17:41:54 +0200
committerBram Moolenaar <Bram@vim.org>2013-06-02 17:41:54 +0200
commitde71b5658f780e1fac29b1ef8b58af3dd42e65ad (patch)
treecdcf529e0fca413b18415513673940763cbd9460
parent525666f28201c313825065d49b98606c8cade457 (diff)
downloadvim-git-7.3.1096.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.txt11
-rw-r--r--src/if_py_both.h46
-rw-r--r--src/testdir/test86.in4
-rw-r--r--src/testdir/test86.ok4
-rw-r--r--src/testdir/test87.in4
-rw-r--r--src/testdir/test87.ok4
-rw-r--r--src/version.c2
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,