[pypy-svn] r49667 - in pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__: . test

cfbolz at codespeak.net cfbolz at codespeak.net
Wed Dec 12 12:17:51 CET 2007


Author: cfbolz
Date: Wed Dec 12 12:17:48 2007
New Revision: 49667

Modified:
   pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/interp_classobj.py
   pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/test/test_classobj.py
Log:
add iter support


Modified: pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/interp_classobj.py
==============================================================================
--- pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/interp_classobj.py	(original)
+++ pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/interp_classobj.py	Wed Dec 12 12:17:48 2007
@@ -309,6 +309,17 @@
         w_meth = self.getattr(space, space.wrap('__delitem__'))
         space.call_function(w_meth, w_key)
 
+    def descr_iter(self, space):
+        w_meth = self.getattr(space, space.wrap('__iter__'), False)
+        if w_meth is not None:
+            return space.call_function(w_meth)
+        w_meth = self.getattr(space, space.wrap('__getitem__'), False)
+        if w_meth is None:
+            raise OperationError(
+                space.w_TypeError,
+                space.wrap("iteration over non-sequence"))
+        return space.newseqiter(self)
+
     def descr_call(self, space, __args__):
         w_meth = self.getattr(space, space.wrap('__call__'))
         return space.call_args(w_meth, __args__)
@@ -350,6 +361,8 @@
                              unwrap_spec=['self', ObjSpace, W_Root, W_Root]),
     __delitem__ = interp2app(W_InstanceObject.descr_delitem,
                              unwrap_spec=['self', ObjSpace, W_Root]),
+    __iter__ = interp2app(W_InstanceObject.descr_iter,
+                          unwrap_spec=['self', ObjSpace]),
     __call__ = interp2app(W_InstanceObject.descr_call,
                           unwrap_spec=['self', ObjSpace, Arguments]),
     __nonzero__ = interp2app(W_InstanceObject.descr_nonzero,

Modified: pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/test/test_classobj.py
==============================================================================
--- pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/test/test_classobj.py	(original)
+++ pypy/branch/interplevel-oldstyle-classes/pypy/module/__builtin__/test/test_classobj.py	Wed Dec 12 12:17:48 2007
@@ -79,7 +79,6 @@
         raises(TypeError, "del A.__dict__")
         raises(TypeError, "del A.__bases__")
 
-
     def test_mutate_instance_special(self):
         class A:
             __metaclass__ = nclassobj
@@ -307,3 +306,23 @@
         a = A()
         assert repr(a).startswith("<__builtin__.A instance at")
         assert str(a) == "foo"
+
+    def test_iter(self):
+        class A:
+            __metaclass__ = nclassobj
+            def __init__(self):
+                self.list = [1, 2, 3, 4, 5]
+            def __iter__(self):
+                return iter(self.list)
+        for i, element in enumerate(A()):
+            assert i + 1 == element
+        class A:
+            __metaclass__ = nclassobj
+            def __init__(self):
+                self.list = [1, 2, 3, 4, 5]
+            def __len__(self):
+                return len(self.list)
+            def __getitem__(self, i):
+                return self.list[i]
+        for i, element in enumerate(A()):
+            assert i + 1 == element



More information about the Pypy-commit mailing list