[3.7] bpo-33026: Fix jumping out of "with" block by setting f_lineno. (GH-6026). (#6074)
(cherry picked from commit 26c9f565d0
)
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
parent
39441fce02
commit
04aadf23ea
|
@ -797,6 +797,34 @@ class JumpTestCase(unittest.TestCase):
|
||||||
with tracecontext(output, 4):
|
with tracecontext(output, 4):
|
||||||
output.append(5)
|
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])
|
@jump_test(8, 11, [1, 3, 5, 11, 12])
|
||||||
def test_jump_out_of_complex_nested_blocks(output):
|
def test_jump_out_of_complex_nested_blocks(output):
|
||||||
output.append(1)
|
output.append(1)
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Fixed jumping out of "with" block by setting f_lineno.
|
|
@ -320,6 +320,13 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno)
|
||||||
PyObject *v = (*--f->f_stacktop);
|
PyObject *v = (*--f->f_stacktop);
|
||||||
Py_DECREF(v);
|
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. */
|
/* Finally set the new f_lineno and f_lasti and return OK. */
|
||||||
|
|
Loading…
Reference in New Issue