[pypy-svn] rev 2365 - in pypy/trunk/src/pypy/module: . test

pmaupin at codespeak.net pmaupin at codespeak.net
Tue Dec 16 14:32:23 CET 2003


Author: pmaupin
Date: Tue Dec 16 14:32:23 2003
New Revision: 2365

Modified:
   pypy/trunk/src/pypy/module/builtin.py
   pypy/trunk/src/pypy/module/test/test_builtin.py
Log:
Added iter() two-parameter functionality

Modified: pypy/trunk/src/pypy/module/builtin.py
==============================================================================
--- pypy/trunk/src/pypy/module/builtin.py	(original)
+++ pypy/trunk/src/pypy/module/builtin.py	Tue Dec 16 14:32:23 2003
@@ -3,6 +3,7 @@
 from pypy.interpreter.module import Module
 from pypy.interpreter.extmodule import ExtModule
 from pypy.interpreter.error import OperationError
+from pypy.interpreter.gateway import app2interp
 
 import os.path
 import sys
@@ -20,6 +21,15 @@
         passed. 
     """
 
+def app_iter_generator(callable_,sentinel):
+    while 1:
+        result = callable_()
+        if result == sentinel:
+            raise StopIteration
+        yield result
+
+iter_generator = app2interp(app_iter_generator)
+
 class __builtin__(ExtModule):
     """ Template for PyPy's '__builtin__' module.
     """
@@ -283,9 +293,14 @@
     def issubclass(self, w_cls1, w_cls2):
         return self.space.issubtype(w_cls1, w_cls2)
 
-    #XXX missing: second form of iter (callable, sentintel) 
-    def iter(self, w_collection):
-        return self.space.iter(w_collection)
+    def iter(self, w_collection_or_callable, w_sentinel = _noarg):
+        if w_sentinel is _noarg:
+            return self.space.iter(w_collection_or_callable)
+        else:
+            if not self.space.is_true(self.callable(w_collection_or_callable)):
+                raise OperationError(self.space.w_TypeError,
+                        self.space.wrap('iter(v, w): v must be callable'))
+            return iter_generator(self.space, w_collection_or_callable, w_sentinel)
 
     def ord(self, w_val):
         return self.space.ord(w_val)

Modified: pypy/trunk/src/pypy/module/test/test_builtin.py
==============================================================================
--- pypy/trunk/src/pypy/module/test/test_builtin.py	(original)
+++ pypy/trunk/src/pypy/module/test/test_builtin.py	Tue Dec 16 14:32:23 2003
@@ -27,6 +27,20 @@
     def test_type_selftest(self):
         self.assert_(type(type) is type)
 
+    def test_iter(self):
+        class count(object):
+            def __init__(self):
+                self.value = 0
+            def __call__(self):
+                self.value += 1
+                return self.value
+        self.assertRaises(TypeError,iter,3)
+        self.assertRaises(TypeError,iter,3,5)
+        x = iter(count(),3)
+        self.assertEquals(x.next(),1)
+        self.assertEquals(x.next(),2)
+        self.assertRaises(StopIteration,x.next)
+        
     def test_xrange_args(self):
         x = xrange(2)
         self.assertEquals(x.start, 0)


More information about the Pypy-commit mailing list