Author: Armin Rigo <[email protected]>
Branch: all_ordered_dicts
Changeset: r75410:6069cfccdda9
Date: 2015-01-17 12:07 +0100
http://bitbucket.org/pypy/pypy/changeset/6069cfccdda9/
Log: test and fix
diff --git a/rpython/rtyper/lltypesystem/rordereddict.py
b/rpython/rtyper/lltypesystem/rordereddict.py
--- a/rpython/rtyper/lltypesystem/rordereddict.py
+++ b/rpython/rtyper/lltypesystem/rordereddict.py
@@ -747,7 +747,12 @@
if ENTRIES.must_clear_value:
entry.value = lltype.nullptr(ENTRY.value.TO)
- if index == d.num_ever_used_items - 1:
+ if d.num_live_items == 0:
+ # Dict is now empty. Reset these fields.
+ d.num_ever_used_items = 0
+ d.lookup_function_no &= FUNC_MASK
+
+ elif index == d.num_ever_used_items - 1:
# The last element of the ordereddict has been deleted. Instead of
# simply marking the item as dead, we can safely reuse it. Since it's
# also possible that there are more dead items immediately behind the
diff --git a/rpython/rtyper/test/test_rordereddict.py
b/rpython/rtyper/test/test_rordereddict.py
--- a/rpython/rtyper/test/test_rordereddict.py
+++ b/rpython/rtyper/test/test_rordereddict.py
@@ -176,6 +176,22 @@
ll_iter = rordereddict.ll_dictiter(ITER, ll_d)
py.test.raises(StopIteration, rordereddict._ll_dictnext, ll_iter)
+ def test_popitem_first_bug(self):
+ DICT = self._get_str_dict()
+ ll_d = rordereddict.ll_newdict(DICT)
+ rordereddict.ll_dict_setitem(ll_d, llstr("k"), 1)
+ rordereddict.ll_dict_setitem(ll_d, llstr("j"), 1)
+ rordereddict.ll_dict_delitem(ll_d, llstr("k"))
+ ITER = rordereddict.get_ll_dictiter(lltype.Ptr(DICT))
+ ll_iter = rordereddict.ll_dictiter(ITER, ll_d)
+ num = rordereddict._ll_dictnext(ll_iter)
+ ll_key = ll_d.entries[num].key
+ assert hlstr(ll_key) == "j"
+ assert ll_d.lookup_function_no == 4 # 1 free item found at the start
+ rordereddict.ll_dict_delitem(ll_d, llstr("j"))
+ assert ll_d.num_ever_used_items == 0
+ assert ll_d.lookup_function_no == 0 # reset
+
def test_direct_enter_and_del(self):
def eq(a, b):
return a == b
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit