[pypy-commit] pypy default: Tweak to dict.update().
arigo
noreply at buildbot.pypy.org
Thu Jul 3 20:03:38 CEST 2014
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r72329:b5a2e5eb59dc
Date: 2014-07-03 12:36 +0200
http://bitbucket.org/pypy/pypy/changeset/b5a2e5eb59dc/
Log: Tweak to dict.update().
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
@@ -492,6 +492,23 @@
def view_as_kwargs(self, w_dict):
return (None, None)
+ def getiterkeys(self, w_dict):
+ raise NotImplementedError
+
+ def getitervalues(self, w_dict):
+ raise NotImplementedError
+
+ def getiteritems(self, w_dict):
+ raise NotImplementedError
+
+ def rev_update1_dict_dict(self, w_dict, w_updatedict):
+ iteritems = self.iteritems(w_dict)
+ while True:
+ w_key, w_value = iteritems.next_item()
+ if w_key is None:
+ break
+ w_updatedict.setitem(w_key, w_value)
+
class EmptyDictStrategy(DictStrategy):
erase, unerase = rerased.new_erasing_pair("empty")
@@ -593,11 +610,13 @@
# ---------- iterator interface ----------------
def getiterkeys(self, w_dict):
- return iter([None])
- getitervalues = getiterkeys
+ return iter([])
+
+ def getitervalues(self, w_dict):
+ return iter([])
def getiteritems(self, w_dict):
- return iter([(None, None)])
+ return iter([])
# Iterator Implementation base classes
@@ -725,9 +744,29 @@
def iteritems(self, w_dict):
return IterClassItems(self.space, self, w_dict)
+
+ @jit.look_inside_iff(lambda self, w_dict, w_updatedict:
+ w_dict_unrolling_heuristic(w_dict))
+ def rev_update1_dict_dict(self, w_dict, w_updatedict):
+ if override_next_item is not None:
+ # this is very similar to the general version, but the difference
+ # is that it is specialized to call a specific next_item()
+ iteritems = IterClassItems(self.space, self, w_dict)
+ while True:
+ w_key, w_value = iteritems.next_item()
+ if w_key is None:
+ break
+ w_updatedict.setitem(w_key, w_value)
+ else:
+ for key, value in self.getiteritems(w_dict):
+ w_key = wrapkey(self.space, key)
+ w_value = wrapvalue(self.space, value)
+ w_updatedict.setitem(w_key, w_value)
+
dictimpl.iterkeys = iterkeys
dictimpl.itervalues = itervalues
dictimpl.iteritems = iteritems
+ dictimpl.rev_update1_dict_dict = rev_update1_dict_dict
create_iterator_classes(EmptyDictStrategy)
@@ -1063,15 +1102,8 @@
update1_keys(space, w_dict, w_data, data_w)
- at jit.look_inside_iff(lambda space, w_dict, w_data:
- w_dict_unrolling_heuristic(w_data))
def update1_dict_dict(space, w_dict, w_data):
- iterator = w_data.iteritems()
- while True:
- w_key, w_value = iterator.next_item()
- if w_key is None:
- break
- w_dict.setitem(w_key, w_value)
+ w_data.strategy.rev_update1_dict_dict(w_data, w_dict)
def update1_pairs(space, w_dict, data_w):
More information about the pypy-commit
mailing list