]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Disallow 'yield' in a 'try' block when there's a 'finally' clause.
authorTim Peters <tim.peters@gmail.com>
Sat, 23 Jun 2001 02:07:08 +0000 (02:07 +0000)
committerTim Peters <tim.peters@gmail.com>
Sat, 23 Jun 2001 02:07:08 +0000 (02:07 +0000)
Derived from Thomas Wouters's patch on the Iterators list, but doesn't
try to read c->c_block[c->c_nblocks].

Python/compile.c

index 6c13bb9bd9391c6b8c180f33afdf5f789f16a7f1..843cf098e842838a7ee2e27669dc1e19d2082364 100644 (file)
@@ -2659,10 +2659,20 @@ com_return_stmt(struct compiling *c, node *n)
 static void
 com_yield_stmt(struct compiling *c, node *n)
 {
+       int i;
        REQ(n, yield_stmt); /* 'yield' testlist */
        if (!c->c_infunction) {
                com_error(c, PyExc_SyntaxError, "'yield' outside function");
        }
+       
+       for (i = 0; i < c->c_nblocks; ++i) {
+               if (c->c_block[i] == SETUP_FINALLY) {
+                       com_error(c, PyExc_SyntaxError,
+                                 "'yield' not allowed in a 'try' block "
+                                 "with a 'finally' clause");
+                       return;
+               }
+       }
        com_node(c, CHILD(n, 1));
        com_addbyte(c, YIELD_VALUE);
        com_pop(c, 1);