@@ -322,7 +322,8 @@ enum why_code {
322322 WHY_EXCEPTION , /* Exception occurred */
323323 WHY_RERAISE , /* Exception re-raised by 'finally' */
324324 WHY_RETURN , /* 'return' statement */
325- WHY_BREAK /* 'break' statement */
325+ WHY_BREAK , /* 'break' statement */
326+ WHY_CONTINUE , /* 'continue' statement */
326327};
327328
328329static enum why_code do_raise (PyObject * , PyObject * , PyObject * );
@@ -1357,6 +1358,11 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
13571358 case BREAK_LOOP :
13581359 why = WHY_BREAK ;
13591360 break ;
1361+
1362+ case CONTINUE_LOOP :
1363+ retval = PyInt_FromLong (oparg );
1364+ why = WHY_CONTINUE ;
1365+ break ;
13601366
13611367 case RAISE_VARARGS :
13621368 u = v = w = NULL ;
@@ -1419,7 +1425,8 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
14191425 v = POP ();
14201426 if (PyInt_Check (v )) {
14211427 why = (enum why_code ) PyInt_AsLong (v );
1422- if (why == WHY_RETURN )
1428+ if (why == WHY_RETURN ||
1429+ why == CONTINUE_LOOP )
14231430 retval = POP ();
14241431 }
14251432 else if (PyString_Check (v ) || PyClass_Check (v )) {
@@ -1834,7 +1841,7 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
18341841 case SETUP_EXCEPT :
18351842 case SETUP_FINALLY :
18361843 PyFrame_BlockSetup (f , opcode , INSTR_OFFSET () + oparg ,
1837- STACK_LEVEL ());
1844+ STACK_LEVEL ());
18381845 continue ;
18391846
18401847 case SET_LINENO :
@@ -2110,6 +2117,18 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
21102117
21112118 while (why != WHY_NOT && f -> f_iblock > 0 ) {
21122119 PyTryBlock * b = PyFrame_BlockPop (f );
2120+
2121+ if (b -> b_type == SETUP_LOOP && why == WHY_CONTINUE ) {
2122+ /* For a continue inside a try block,
2123+ don't pop the block for the loop. */
2124+ PyFrame_BlockSetup (f , b -> b_type , b -> b_level ,
2125+ b -> b_handler );
2126+ why = WHY_NOT ;
2127+ JUMPTO (PyInt_AS_LONG (retval ));
2128+ Py_DECREF (retval );
2129+ break ;
2130+ }
2131+
21132132 while (STACK_LEVEL () > b -> b_level ) {
21142133 v = POP ();
21152134 Py_XDECREF (v );
@@ -2145,7 +2164,8 @@ eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
21452164 PUSH (exc );
21462165 }
21472166 else {
2148- if (why == WHY_RETURN )
2167+ if (why == WHY_RETURN ||
2168+ why == CONTINUE_LOOP )
21492169 PUSH (retval );
21502170 v = PyInt_FromLong ((long )why );
21512171 PUSH (v );
0 commit comments