From: Raymond Hettinger Date: Fri, 6 Feb 2004 18:32:33 +0000 (+0000) Subject: SF patch #864059: optimize eval_frame X-Git-Tag: v2.4a1~868 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1dd8309246a1a1dfb1d28957d0a2a1aa64fbd4fe;p=thirdparty%2FPython%2Fcpython.git SF patch #864059: optimize eval_frame Simplified version of Neal Norwitz's patch which adds gotos for opcodes that set "why". This skips a number of tests where the outcome of the tests are known in advance. --- diff --git a/Python/ceval.c b/Python/ceval.c index f198da1a8f5c..c6e04702443e 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1578,12 +1578,12 @@ eval_frame(PyFrameObject *f) #endif case BREAK_LOOP: why = WHY_BREAK; - break; + goto fast_block_end; case CONTINUE_LOOP: retval = PyInt_FromLong(oparg); why = WHY_CONTINUE; - break; + goto fast_block_end; case RAISE_VARARGS: u = v = w = NULL; @@ -1620,14 +1620,13 @@ eval_frame(PyFrameObject *f) case RETURN_VALUE: retval = POP(); why = WHY_RETURN; - break; + goto fast_block_end; case YIELD_VALUE: retval = POP(); f->f_stacktop = stack_pointer; why = WHY_YIELD; - break; - + goto fast_yield; case EXEC_STMT: w = TOP(); @@ -2327,6 +2326,7 @@ eval_frame(PyFrameObject *f) /* Unwind stacks if a (pseudo) exception occurred */ +fast_block_end: while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) { PyTryBlock *b = PyFrame_BlockPop(f); @@ -2410,6 +2410,7 @@ eval_frame(PyFrameObject *f) if (why != WHY_RETURN && why != WHY_YIELD) retval = NULL; +fast_yield: if (tstate->use_tracing) { if (tstate->c_tracefunc && (why == WHY_RETURN || why == WHY_YIELD)) {