small optimization: avoid popping the current block until we have to
This commit is contained in:
parent
4f24767938
commit
4a3cf191f4
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue