[pypy-commit] pypy dict-move-to-end: Add move_to_xx to the main hypothesis test. Simplify ll_dict_copy()
arigo
pypy.commits at gmail.com
Sat Feb 4 17:53:33 EST 2017
Author: Armin Rigo <arigo at tunes.org>
Branch: dict-move-to-end
Changeset: r89931:481903aaf279
Date: 2017-02-04 22:03 +0100
http://bitbucket.org/pypy/pypy/changeset/481903aaf279/
Log: Add move_to_xx to the main hypothesis test. Simplify ll_dict_copy()
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
@@ -1263,18 +1263,8 @@
if hasattr(DICT, 'fnkeyhash'):
newdict.fnkeyhash = dict.fnkeyhash
- i = 0
- while i < newdict.num_ever_used_items:
- d_entry = newdict.entries[i]
- entry = dict.entries[i]
- ENTRY = lltype.typeOf(newdict.entries).TO.OF
- d_entry.key = entry.key
- if hasattr(ENTRY, 'f_valid'):
- d_entry.f_valid = entry.f_valid
- d_entry.value = entry.value
- if hasattr(ENTRY, 'f_hash'):
- d_entry.f_hash = entry.f_hash
- i += 1
+ rgc.ll_arraycopy(dict.entries, newdict.entries, 0, 0,
+ newdict.num_ever_used_items)
ll_dict_reindex(newdict, _ll_len_of_d_indexes(dict))
return newdict
diff --git a/rpython/rtyper/test/test_rdict.py b/rpython/rtyper/test/test_rdict.py
--- a/rpython/rtyper/test/test_rdict.py
+++ b/rpython/rtyper/test/test_rdict.py
@@ -1188,6 +1188,12 @@
assert not self.ll_contains(self.l_dict, ll_key)
self.removed_keys.append(key)
+ def move_to_end(self, key, last=True):
+ "For test_rordereddict"
+
+ def move_to_beginning(self, key):
+ self.move_to_end(key, last=False)
+
def copydict(self):
self.l_dict = self.ll_copy(self.l_dict)
assert self.ll_len(self.l_dict) == len(self.reference)
@@ -1250,6 +1256,15 @@
return builds(Action,
just('delitem'), tuples(sampled_from(self.space.reference)))
+ def st_move_to_end(self):
+ return builds(Action,
+ just('move_to_end'), tuples(sampled_from(self.space.reference)))
+
+ def st_move_to_beginning(self):
+ return builds(Action,
+ just('move_to_beginning'),
+ tuples(sampled_from(self.space.reference)))
+
def steps(self):
if not self.space:
return builds(Action, just('setup'), tuples(st_keys, st_values))
@@ -1258,7 +1273,8 @@
if self.space.reference:
return (
self.st_setitem() | sampled_from(global_actions) |
- self.st_updateitem() | self.st_delitem())
+ self.st_updateitem() | self.st_delitem() |
+ self.st_move_to_end() | self.st_move_to_beginning())
else:
return (self.st_setitem() | sampled_from(global_actions))
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
@@ -421,6 +421,7 @@
class ODictSpace(MappingSpace):
MappingRepr = rodct.OrderedDictRepr
new_reference = OrderedDict
+ moved_around = False
ll_getitem = staticmethod(rodct.ll_dict_getitem)
ll_setitem = staticmethod(rodct.ll_dict_setitem)
ll_delitem = staticmethod(rodct.ll_dict_delitem)
@@ -465,9 +466,23 @@
def removeindex(self):
# remove the index, as done during translation for prebuilt dicts
# (but cannot be done if we already removed a key)
- if not self.removed_keys:
+ if not self.removed_keys and not self.moved_around:
rodct.ll_no_initial_index(self.l_dict)
+ def move_to_end(self, key, last=True):
+ ll_key = self.ll_key(key)
+ rodct.ll_dict_move_to_end(self.l_dict, ll_key, last)
+ value = self.reference.pop(key)
+ if last:
+ self.reference[key] = value
+ else:
+ items = self.reference.items()
+ self.reference.clear()
+ self.reference[key] = value
+ self.reference.update(items)
+ # prevent ll_no_initial_index()
+ self.moved_around = True
+
def fullcheck(self):
# overridden to also check key order
assert self.ll_len(self.l_dict) == len(self.reference)
More information about the pypy-commit
mailing list