[pypy-svn] r78295 - in pypy/branch/set-object-cleanup/pypy/objspace/std: . test
arigo at codespeak.net
arigo at codespeak.net
Tue Oct 26 14:52:14 CEST 2010
Author: arigo
Date: Tue Oct 26 14:52:13 2010
New Revision: 78295
Modified:
pypy/branch/set-object-cleanup/pypy/objspace/std/dictmultiobject.py
pypy/branch/set-object-cleanup/pypy/objspace/std/dicttype.py
pypy/branch/set-object-cleanup/pypy/objspace/std/test/test_dictmultiobject.py
Log:
Move update1() to interp-level.
Modified: pypy/branch/set-object-cleanup/pypy/objspace/std/dictmultiobject.py
==============================================================================
--- pypy/branch/set-object-cleanup/pypy/objspace/std/dictmultiobject.py (original)
+++ pypy/branch/set-object-cleanup/pypy/objspace/std/dictmultiobject.py Tue Oct 26 14:52:13 2010
@@ -641,28 +641,42 @@
init_signature = Signature(['seq_or_map'], None, 'kwargs')
init_defaults = [None]
+def update1(space, w_dict, w_data):
+ if space.findattr(w_data, space.wrap("keys")) is None:
+ # no 'keys' method, so we assume it is a sequence of pairs
+ for w_pair in space.listview(w_data):
+ pair = space.fixedview(w_pair)
+ if len(pair) != 2:
+ raise OperationError(space.w_ValueError,
+ space.wrap("sequence of pairs expected"))
+ w_key, w_value = pair
+ w_dict.setitem(w_key, w_value)
+ else:
+ if isinstance(w_data, W_DictMultiObject): # optimization case only
+ update1_dict_dict(space, w_dict, w_data)
+ else:
+ # general case -- "for k in o.keys(): dict.__setitem__(d, k, o[k])"
+ w_keys = space.call_method(w_data, "keys")
+ for w_key in space.listview(w_keys):
+ w_value = space.getitem(w_data, w_key)
+ w_dict.setitem(w_key, w_value)
+
+def update1_dict_dict(space, w_dict, w_data):
+ iterator = w_data.iter()
+ while 1:
+ w_key, w_value = iterator.next()
+ if w_key is None:
+ break
+ w_dict.setitem(w_key, w_value)
+
def init_or_update(space, w_dict, __args__, funcname):
w_src, w_kwds = __args__.parse_obj(
None, funcname,
init_signature, # signature
init_defaults) # default argument
- if w_src is None:
- pass
- elif space.findattr(w_src, space.wrap("keys")) is None:
- list_of_w_pairs = space.listview(w_src)
- for w_pair in list_of_w_pairs:
- pair = space.fixedview(w_pair)
- if len(pair)!=2:
- raise OperationError(space.w_ValueError,
- space.wrap("dict() takes a sequence of pairs"))
- w_k, w_v = pair
- w_dict.setitem(w_k, w_v)
- else:
- if space.is_true(w_src):
- from pypy.objspace.std.dicttype import update1
- update1(space, w_dict, w_src)
+ if w_src is not None:
+ update1(space, w_dict, w_src)
if space.is_true(w_kwds):
- from pypy.objspace.std.dicttype import update1
update1(space, w_dict, w_kwds)
def init__DictMulti(space, w_dict, __args__):
@@ -764,9 +778,8 @@
return w_res
def dict_copy__DictMulti(space, w_self):
- from pypy.objspace.std.dicttype import update1
w_new = W_DictMultiObject.allocate_and_init_instance(space)
- update1(space, w_new, w_self)
+ update1_dict_dict(space, w_new, w_self)
return w_new
def dict_items__DictMulti(space, w_self):
Modified: pypy/branch/set-object-cleanup/pypy/objspace/std/dicttype.py
==============================================================================
--- pypy/branch/set-object-cleanup/pypy/objspace/std/dicttype.py (original)
+++ pypy/branch/set-object-cleanup/pypy/objspace/std/dicttype.py Tue Oct 26 14:52:13 2010
@@ -64,14 +64,6 @@
# CPython does not call it when doing builtin operations. The
# same for other operations.
- def update1(d, o):
- if hasattr(o, 'keys'):
- for k in o.keys():
- dict.__setitem__(d, k, o[k])
- else:
- for k,v in o:
- dict.__setitem__(d, k, v)
-
def popitem(d):
for k in dict.iterkeys(d):
break
@@ -91,7 +83,6 @@
dict_popitem__ANY = app.interphook("popitem")
dict_setdefault__ANY_ANY_ANY = app.interphook("setdefault")
-update1 = app.interphook("update1")
register_all(vars(), globals())
Modified: pypy/branch/set-object-cleanup/pypy/objspace/std/test/test_dictmultiobject.py
==============================================================================
--- pypy/branch/set-object-cleanup/pypy/objspace/std/test/test_dictmultiobject.py (original)
+++ pypy/branch/set-object-cleanup/pypy/objspace/std/test/test_dictmultiobject.py Tue Oct 26 14:52:13 2010
@@ -446,7 +446,9 @@
d1 = {}
d2 = D(a='foo')
d1.update(d2)
- assert d1['a'] == 42 # fails on CPython, d1['a'] == 'foo'
+ assert d1['a'] == 'foo'
+ # a bit of an obscure case: now (from r78295) we get the same result
+ # as CPython does
def test_index_keyerror_unpacking(self):
d = {}
More information about the Pypy-commit
mailing list