]> granicus.if.org Git - python/commitdiff
[3.6] bpo-33026: Fix jumping out of "with" block by setting f_lineno. (GH-6026)....
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Sun, 11 Mar 2018 08:21:13 +0000 (00:21 -0800)
committerSerhiy Storchaka <storchaka@gmail.com>
Sun, 11 Mar 2018 08:21:13 +0000 (10:21 +0200)
(cherry picked from commit 26c9f565d016db21257a60d29ab2c99383dd5ac7)
(cherry picked from commit 04aadf23eac51fec2e436c5960c1362bbb7d03de)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Lib/test/test_sys_settrace.py
Misc/NEWS.d/next/Core and Builtins/2018-03-08-09-48-38.bpo-33026.QZA3Ba.rst [new file with mode: 0644]
Objects/frameobject.c

index 5b3b0660b892141909f539dad61aab09b275b240..a05fbbd04a842233c5d300ac1973fdd9e985b794 100644 (file)
@@ -751,6 +751,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 (file)
index 0000000..dc166d1
--- /dev/null
@@ -0,0 +1 @@
+Fixed jumping out of "with" block by setting f_lineno.
index 62f9f34c8ebf7ceae84276a1cca4d459dcf24ce0..5c73e8560f86b55bd34647029cae07aaed4daad7 100644 (file)
@@ -317,6 +317,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. */