Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions Lib/test/test_grammar.py
Original file line number Diff line number Diff line change
Expand Up @@ -969,6 +969,17 @@ def test_continue_in_finally(self):
break
self.assertEqual(count, 1)


def _wrap():
for number in range(2):
try:
return number
finally:
continue

with self.assertRaises(RuntimeError):
_wrap()

def test_return_in_finally(self):
def g1():
try:
Expand Down
2 changes: 1 addition & 1 deletion Lib/test/test_iter.py
Original file line number Diff line number Diff line change
Expand Up @@ -983,7 +983,7 @@ def __next__(self):
try:
for i in BadIterator() :
pass
except TypeError:
except RuntimeError:
pass

def test_extending_list_with_iterator_does_not_segfault(self):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Raise `RuntimeError` instead of getting seg fault on special cases like
returning inside of a try also using continue inside of finally.
9 changes: 9 additions & 0 deletions Python/ceval.c
Original file line number Diff line number Diff line change
Expand Up @@ -3195,6 +3195,15 @@ _PyEval_EvalFrameDefault(PyFrameObject *f, int throwflag)
PREDICTED(FOR_ITER);
/* before: [iter]; after: [iter, iter()] *or* [] */
PyObject *iter = TOP();
if (!PyIter_Check(iter)){
iter = POP();
Py_CLEAR(iter);
_PyErr_SetString(tstate, PyExc_RuntimeError,
"cannot use continue inside of a finally "
"if you are returning the iterated value "
"inside try");
goto error;
}
PyObject *next = (*iter->ob_type->tp_iternext)(iter);
if (next != NULL) {
PUSH(next);
Expand Down