diff Python/compile.c @ 18243:47717e5667eb legacy-trunk

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.
author Tim Peters <tim.peters@gmail.com>
date Sat, 23 Jun 2001 06:19:16 +0000
parents 4ebd292c975f
children 86dab0d43b73
line wrap: on
line diff
--- a/Python/compile.c	Sat Jun 23 06:16:52 2001 +0000
+++ b/Python/compile.c	Sat Jun 23 06:19:16 2001 +0000
@@ -2639,20 +2639,14 @@
 			com_error(c, PyExc_SyntaxError,
 				  "'return' with argument inside generator");
 		}
-		com_addoparg(c, LOAD_CONST,
-				com_addconst(c, PyExc_StopIteration));
-		com_push(c, 1);
-		com_addoparg(c, RAISE_VARARGS, 1);
 	}
-	else {
-		if (NCH(n) < 2) {
-			com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
-			com_push(c, 1);
-		}
-		else
-			com_node(c, CHILD(n, 1));
-		com_addbyte(c, RETURN_VALUE);
+	if (NCH(n) < 2) {
+		com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
+		com_push(c, 1);
 	}
+	else
+		com_node(c, CHILD(n, 1));
+	com_addbyte(c, RETURN_VALUE);
 	com_pop(c, 1);
 }
 
@@ -3711,19 +3705,10 @@
 	c->c_infunction = 1;
 	com_node(c, CHILD(n, 4));
 	c->c_infunction = 0;
-	if (c->c_flags & CO_GENERATOR) {
-		com_addoparg(c, LOAD_CONST,
-				com_addconst(c, PyExc_StopIteration));
-		com_push(c, 1);
-		com_addoparg(c, RAISE_VARARGS, 1);
-		com_pop(c, 1);
-	}
-	else {
-		com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
-		com_push(c, 1);
-		com_addbyte(c, RETURN_VALUE);
-		com_pop(c, 1);
-	}
+	com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
+	com_push(c, 1);
+	com_addbyte(c, RETURN_VALUE);
+	com_pop(c, 1);
 }
 
 static void