[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