Author: Armin Rigo <ar...@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) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit