[pypy-commit] pypy default: cpyext: fill type slots tp_iter and tp_iternext
amauryfa
noreply at buildbot.pypy.org
Thu Feb 16 20:38:55 CET 2012
Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch:
Changeset: r52567:873f837ca9f4
Date: 2012-02-16 20:37 +0100
http://bitbucket.org/pypy/pypy/changeset/873f837ca9f4/
Log: cpyext: fill type slots tp_iter and tp_iternext
diff --git a/pypy/module/cpyext/slotdefs.py b/pypy/module/cpyext/slotdefs.py
--- a/pypy/module/cpyext/slotdefs.py
+++ b/pypy/module/cpyext/slotdefs.py
@@ -291,6 +291,14 @@
def slot_nb_int(space, w_self):
return space.int(w_self)
+ at cpython_api([PyObject], PyObject, external=False)
+def slot_tp_iter(space, w_self):
+ return space.iter(w_self)
+
+ at cpython_api([PyObject], PyObject, external=False)
+def slot_tp_iternext(space, w_self):
+ return space.next(w_self)
+
from pypy.rlib.nonconst import NonConstant
SLOTS = {}
diff --git a/pypy/module/cpyext/test/test_typeobject.py b/pypy/module/cpyext/test/test_typeobject.py
--- a/pypy/module/cpyext/test/test_typeobject.py
+++ b/pypy/module/cpyext/test/test_typeobject.py
@@ -425,3 +425,32 @@
''')
obj = module.new_obj()
raises(ZeroDivisionError, obj.__setitem__, 5, None)
+
+ def test_tp_iter(self):
+ module = self.import_extension('foo', [
+ ("tp_iter", "METH_O",
+ '''
+ if (!args->ob_type->tp_iter)
+ {
+ PyErr_SetNone(PyExc_ValueError);
+ return NULL;
+ }
+ return args->ob_type->tp_iter(args);
+ '''
+ ),
+ ("tp_iternext", "METH_O",
+ '''
+ if (!args->ob_type->tp_iternext)
+ {
+ PyErr_SetNone(PyExc_ValueError);
+ return NULL;
+ }
+ return args->ob_type->tp_iternext(args);
+ '''
+ )
+ ])
+ l = [1]
+ it = module.tp_iter(l)
+ assert type(it) is type(iter([]))
+ assert module.tp_iternext(it) == 1
+ raises(StopIteration, module.tp_iternext, it)
More information about the pypy-commit
mailing list