From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Sun, 11 Mar 2018 08:55:59 +0000 (-0800) Subject: [2.7] bpo-33026: Fix jumping out of "with" block by setting f_lineno. (GH-6026).... X-Git-Tag: v2.7.15rc1~23 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3854f5885edc8dc67b1aba82fbb525604fbc625b;p=python [2.7] bpo-33026: Fix jumping out of "with" block by setting f_lineno. (GH-6026). (GH-6074) (GH-6076) (cherry picked from commit 26c9f565d016db21257a60d29ab2c99383dd5ac7) (cherry picked from commit 04aadf23eac51fec2e436c5960c1362bbb7d03de) Co-authored-by: Serhiy Storchaka --- diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 7e1d7a131f..04b1ac339a 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -723,6 +723,34 @@ class JumpTestCase(unittest.TestCase): 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) diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-03-08-09-48-38.bpo-33026.QZA3Ba.rst b/Misc/NEWS.d/next/Core and Builtins/2018-03-08-09-48-38.bpo-33026.QZA3Ba.rst new file mode 100644 index 0000000000..dc166d1e57 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2018-03-08-09-48-38.bpo-33026.QZA3Ba.rst @@ -0,0 +1 @@ +Fixed jumping out of "with" block by setting f_lineno. diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 2c8fb01749..bf1c7c5273 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -340,6 +340,11 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno) PyObject *v = (*--f->f_stacktop); Py_DECREF(v); } + if (b->b_type == SETUP_WITH) { + /* Pop the exit function. */ + PyObject *v = (*--f->f_stacktop); + Py_DECREF(v); + } } /* Finally set the new f_lineno and f_lasti and return OK. */