[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