small optimization: avoid popping the current block until we have to

This commit is contained in:
Benjamin Peterson 2009-07-01 23:45:19 +00:00
parent 4f24767938
commit 4a3cf191f4
1 changed files with 5 additions and 5 deletions

View File

@ -2806,20 +2806,20 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
fast_block_end: fast_block_end:
while (why != WHY_NOT && f->f_iblock > 0) { while (why != WHY_NOT && f->f_iblock > 0) {
PyTryBlock *b = PyFrame_BlockPop(f); /* Peek at the current block. */
PyTryBlock *b = &f->f_blockstack[f->f_iblock - 1];
assert(why != WHY_YIELD); assert(why != WHY_YIELD);
if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) { if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
/* For a continue inside a try block,
don't pop the block for the loop. */
PyFrame_BlockSetup(f, b->b_type, b->b_handler,
b->b_level);
why = WHY_NOT; why = WHY_NOT;
JUMPTO(PyInt_AS_LONG(retval)); JUMPTO(PyInt_AS_LONG(retval));
Py_DECREF(retval); Py_DECREF(retval);
break; break;
} }
/* Now we have to pop the block. */
f->f_iblock--;
while (STACK_LEVEL() > b->b_level) { while (STACK_LEVEL() > b->b_level) {
v = POP(); v = POP();
Py_XDECREF(v); Py_XDECREF(v);