[pypy-commit] pypy default: move_to_end() didn't correctly catch KeyError
arigo
pypy.commits at gmail.com
Mon Feb 6 13:50:48 EST 2017
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r89982:ed03e78e3f85
Date: 2017-02-06 19:50 +0100
http://bitbucket.org/pypy/pypy/changeset/ed03e78e3f85/
Log: move_to_end() didn't correctly catch 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
@@ -1053,7 +1053,10 @@
if self.is_correct_type(w_key):
d = self.unerase(w_dict.dstorage)
key = self.unwrap(w_key)
- objectmodel.move_to_end(d, key, last_flag)
+ try:
+ objectmodel.move_to_end(d, key, last_flag)
+ except KeyError:
+ w_dict.space.raise_key_error(w_key)
else:
self.switch_to_object_strategy(w_dict)
w_dict.nondescr_move_to_end(w_dict.space, w_key, last_flag)
diff --git a/pypy/objspace/std/test/test_dictmultiobject.py b/pypy/objspace/std/test/test_dictmultiobject.py
--- a/pypy/objspace/std/test/test_dictmultiobject.py
+++ b/pypy/objspace/std/test/test_dictmultiobject.py
@@ -307,6 +307,7 @@
assert list(d) == other_keys + [key]
else:
assert list(d) == [key] + other_keys
+ raises(KeyError, __pypy__.move_to_end, d, key * 3, last=last)
def test_keys(self):
d = {1: 2, 3: 4}
diff --git a/rpython/rlib/objectmodel.py b/rpython/rlib/objectmodel.py
--- a/rpython/rlib/objectmodel.py
+++ b/rpython/rlib/objectmodel.py
@@ -783,6 +783,9 @@
def setdefault(self, key, default):
return self._dict.setdefault(_r_dictkey(self, key), default)
+ def pop(self, key, *default):
+ return self._dict.pop(_r_dictkey(self, key), *default)
+
def popitem(self):
dk, value = self._dict.popitem()
return dk.key, value
More information about the pypy-commit
mailing list