Author: Armin Rigo <[email protected]>
Branch:
Changeset: r75374:0e383b1145e4
Date: 2015-01-16 11:41 +0100
http://bitbucket.org/pypy/pypy/changeset/0e383b1145e4/
Log: Test and fix: Cls.__dict__.popitem() => segfault instead of KeyError
diff --git a/pypy/objspace/std/dictmultiobject.py
b/pypy/objspace/std/dictmultiobject.py
--- a/pypy/objspace/std/dictmultiobject.py
+++ b/pypy/objspace/std/dictmultiobject.py
@@ -471,6 +471,8 @@
# provide a better one.
iterator = self.iteritems(w_dict)
w_key, w_value = iterator.next_item()
+ if w_key is None:
+ raise KeyError
self.delitem(w_dict, w_key)
return (w_key, w_value)
diff --git a/pypy/objspace/std/test/test_dictproxy.py
b/pypy/objspace/std/test/test_dictproxy.py
--- a/pypy/objspace/std/test/test_dictproxy.py
+++ b/pypy/objspace/std/test/test_dictproxy.py
@@ -16,14 +16,25 @@
raises(TypeError, 'NotEmpty.__dict__[15] = "y"')
raises(KeyError, 'del NotEmpty.__dict__[15]')
- key, value = NotEmpty.__dict__.popitem()
- assert (key == 'a' and value == 1) or (key == 'b' and value == 4)
-
assert NotEmpty.__dict__.setdefault("string", 1) == 1
assert NotEmpty.__dict__.setdefault("string", 2) == 1
assert NotEmpty.string == 1
raises(TypeError, 'NotEmpty.__dict__.setdefault(15, 1)')
+ def test_dictproxy_popitem(self):
+ class A(object):
+ a = 42
+ seen = 0
+ try:
+ while True:
+ key, value = A.__dict__.popitem()
+ if key == 'a':
+ assert value == 42
+ seen += 1
+ except KeyError:
+ pass
+ assert seen == 1
+
def test_dictproxy_getitem(self):
class NotEmpty(object):
a = 1
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit