summaryrefslogtreecommitdiffstats
path: root/Python/ceval.c
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2001-06-23 06:19:16 (GMT)
committerTim Peters <tim.peters@gmail.com>2001-06-23 06:19:16 (GMT)
commitad1a18b78ef87957a716af47e4c4f125e85565d0 (patch)
treeec93d18836134009e0cc3057c287566bc93a6fbf /Python/ceval.c
parentbe9d10edbb9ca400d73012e9d0a1b068e0f74d14 (diff)
downloadcpython-ad1a18b78ef87957a716af47e4c4f125e85565d0.zip
cpython-ad1a18b78ef87957a716af47e4c4f125e85565d0.tar.gz
cpython-ad1a18b78ef87957a716af47e4c4f125e85565d0.tar.bz2
Change the semantics of "return" in generators, as discussed on the
Iterators list and Python-Dev; e.g., these all pass now: def g1(): try: return except: yield 1 assert list(g1()) == [] def g2(): try: return finally: yield 1 assert list(g2()) == [1] def g3(): for i in range(3): yield None yield None assert list(g3()) == [None] * 4 compile.c: compile_funcdef and com_return_stmt: Just van Rossum's patch to compile the same code for "return" regardless of function type (this goes back to the previous scheme of returning Py_None). ceval.c: gen_iternext: take a return (but not a yield) of Py_None as meaning the generator is exhausted.
Diffstat (limited to 'Python/ceval.c')
-rw-r--r--Python/ceval.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/Python/ceval.c b/Python/ceval.c
index d334775..6a1ba50 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -166,6 +166,13 @@ gen_iternext(genobject *gen)
Py_XDECREF(f->f_back);
f->f_back = NULL;
+ /* If the generator just returned (as opposed to yielding), signal
+ * that the generator is exhausted. */
+ if (result == Py_None && f->f_stacktop == NULL) {
+ Py_DECREF(result);
+ result = NULL;
+ }
+
return result;
}