Backport generators to python < 2.5, use StopIteration instead of GeneratorExit.
authorVitja Makarov <vitja.makarov@gmail.com>
Sun, 19 Dec 2010 07:47:58 +0000 (10:47 +0300)
committerVitja Makarov <vitja.makarov@gmail.com>
Sun, 19 Dec 2010 07:47:58 +0000 (10:47 +0300)
Cython/Compiler/ExprNodes.py
runtests.py
tests/run/generators.pyx

index 2a744a0fc4c5316aed7e93d3aea0ad052fbb47cd..88548fece1d1d655fd6447dc26de76638d9f507f 100755 (executable)
@@ -8360,7 +8360,11 @@ static PyObject *__Pyx_Generator_Close(PyObject *self)
 {
     struct __pyx_Generator_object *generator = (struct __pyx_Generator_object *) self;
     PyObject *retval;
+#if PY_VERSION_HEX < 0x02050000
+    PyErr_SetNone(PyExc_StopIteration);
+#else
     PyErr_SetNone(PyExc_GeneratorExit);
+#endif
     retval = __Pyx_Generator_SendEx(generator, NULL);
     if (retval) {
         Py_DECREF(retval);
@@ -8368,8 +8372,12 @@ static PyObject *__Pyx_Generator_Close(PyObject *self)
                         "generator ignored GeneratorExit");
         return NULL;
     }
+#if PY_VERSION_HEX < 0x02050000
+    if (PyErr_ExceptionMatches(PyExc_StopIteration))
+#else
     if (PyErr_ExceptionMatches(PyExc_StopIteration)
         || PyErr_ExceptionMatches(PyExc_GeneratorExit))
+#endif
     {
         PyErr_Clear();          /* ignore these errors */
         Py_INCREF(Py_None);
index b731f903fc08c69ddd433db81aa18aa50c04eebb..004b0493ee88cd2a320be20130e5ca1e46f99983 100644 (file)
@@ -62,7 +62,6 @@ VER_DEP_MODULES = {
                                           ]),
     (2,5) : (operator.lt, lambda x: x in ['run.any',
                                           'run.all',
-                                          'run.generators',
                                           ]),
     (2,6) : (operator.lt, lambda x: x in ['run.print_function',
                                           'run.cython3',
index 13fc7a6c7091e9a05d9ac38c93f39a58e71dc39c..d435d469921182b1d7c343ad7d49d898d9c6e940 100644 (file)
@@ -5,6 +5,11 @@ except ImportError:
     def next(it):
         return it.next()
 
+if hasattr(__builtins__, 'GeneratorExit'):
+    GeneratorExit = __builtins__.GeneratorExit
+else: # < 2.5
+    GeneratorExit = StopIteration
+
 def very_simple():
     """
     >>> x = very_simple()