@@ -184,6 +184,7 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno)
184184 break ;
185185
186186 case POP_BLOCK :
187+ assert (blockstack_top > 0 );
187188 setup_op = code [blockstack [blockstack_top - 1 ]];
188189 if (setup_op == SETUP_FINALLY ) {
189190 in_finally [blockstack_top - 1 ] = 1 ;
@@ -196,10 +197,13 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno)
196197 case END_FINALLY :
197198 /* Ignore END_FINALLYs for SETUP_EXCEPTs - they exist
198199 * in the bytecode but don't correspond to an actual
199- * 'finally' block. */
200- setup_op = code [blockstack [blockstack_top - 1 ]];
201- if (setup_op == SETUP_FINALLY ) {
202- blockstack_top -- ;
200+ * 'finally' block. (If blockstack_top is 0, we must
201+ * be seeing such an END_FINALLY.) */
202+ if (blockstack_top > 0 ) {
203+ setup_op = code [blockstack [blockstack_top - 1 ]];
204+ if (setup_op == SETUP_FINALLY ) {
205+ blockstack_top -- ;
206+ }
203207 }
204208 break ;
205209 }
@@ -233,6 +237,10 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno)
233237 }
234238 }
235239
240+ /* Verify that the blockstack tracking code didn't get lost. */
241+ assert (blockstack_top == 0 );
242+
243+ /* After all that, are we jumping into / out of a 'finally' block? */
236244 if (new_lasti_setup_addr != f_lasti_setup_addr ) {
237245 PyErr_SetString (PyExc_ValueError ,
238246 "can't jump into or out of a 'finally' block" );
0 commit comments