Skip to content

Commit

Permalink
[3.7] bpo-33026: Fix jumping out of "with" block by setting f_lineno. (
Browse files Browse the repository at this point in the history
…GH-6026). (#6074)

(cherry picked from commit 26c9f56)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
  • Loading branch information
serhiy-storchaka committed Mar 11, 2018
1 parent 39441fc commit 04aadf2
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 0 deletions.
28 changes: 28 additions & 0 deletions Lib/test/test_sys_settrace.py
Expand Up @@ -797,6 +797,34 @@ def test_jump_across_with(output):
with tracecontext(output, 4):
output.append(5)

@jump_test(4, 5, [1, 3, 5, 6])
def test_jump_out_of_with_block_within_for_block(output):
output.append(1)
for i in [1]:
with tracecontext(output, 3):
output.append(4)
output.append(5)
output.append(6)

@jump_test(4, 5, [1, 2, 3, 5, -2, 6])
def test_jump_out_of_with_block_within_with_block(output):
output.append(1)
with tracecontext(output, 2):
with tracecontext(output, 3):
output.append(4)
output.append(5)
output.append(6)

@jump_test(5, 6, [2, 4, 6, 7])
def test_jump_out_of_with_block_within_finally_block(output):
try:
output.append(2)
finally:
with tracecontext(output, 4):
output.append(5)
output.append(6)
output.append(7)

@jump_test(8, 11, [1, 3, 5, 11, 12])
def test_jump_out_of_complex_nested_blocks(output):
output.append(1)
Expand Down
@@ -0,0 +1 @@
Fixed jumping out of "with" block by setting f_lineno.
7 changes: 7 additions & 0 deletions Objects/frameobject.c
Expand Up @@ -320,6 +320,13 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno)
PyObject *v = (*--f->f_stacktop);
Py_DECREF(v);
}
if (b->b_type == SETUP_FINALLY &&
code[b->b_handler] == WITH_CLEANUP_START)
{
/* Pop the exit function. */
PyObject *v = (*--f->f_stacktop);
Py_DECREF(v);
}
}

/* Finally set the new f_lineno and f_lasti and return OK. */
Expand Down

0 comments on commit 04aadf2

Please sign in to comment.