changeset 4698:2db005052371 v7.3.1096

updated for version 7.3.1096 Problem: Python: popitem() was not defined in a standard way. Solution: Remove the argument from popitem(). (ZyX)
author Bram Moolenaar <bram@vim.org>
date Sun, 02 Jun 2013 17:41:54 +0200
parents c905c60b1860
children b74b5b7ec532
files 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
diffstat 7 files changed, 47 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- 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-Diction
                     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`.
--- a/src/if_py_both.h
+++ b/src/if_py_both.h
@@ -1061,17 +1061,6 @@ DictionaryLength(DictionaryObject *self)
 	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, Py
 }
 
     static PyObject *
-DictionaryPopItem(DictionaryObject *self, PyObject *args)
-{
-    PyObject	*keyObject;
-
-    if (!PyArg_ParseTuple(args, "O", &keyObject))
+DictionaryPopItem(DictionaryObject *self)
+{
+    hashitem_T	*hi;
+    PyObject	*r;
+    PyObject	*valObject;
+    dictitem_T	*di;
+
+    if (self->dict->dv_hashtab.ht_used == 0)
+    {
+	PyErr_SetNone(PyExc_KeyError);
 	return NULL;
-
-    return _DictionaryItem(self, keyObject,
-			    DICT_FLAG_POP|DICT_FLAG_RETURN_PAIR);
+    }
+
+    hi = self->dict->dv_hashtab.ht_array;
+    while (HASHITEM_EMPTY(hi))
+	++hi;
+
+    di = dict_lookup(hi);
+
+    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 DictionaryMeth
     {"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}
--- 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
--- 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()),)):(<t
 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
--- 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
--- 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()),)):(<c
 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
--- 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,