From 95c80f84392e6fb2a023542a0a4a50dfe3298cc2 Mon Sep 17 00:00:00 2001 From: Tim Peters Date: Sat, 23 Jun 2001 02:07:08 +0000 Subject: Disallow 'yield' in a 'try' block when there's a 'finally' clause. 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 | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Python/compile.c b/Python/compile.c index 6c13bb9..843cf09 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -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); -- cgit v0.12