]> granicus.if.org Git - python/commitdiff
pop the loop block even for infinite while loops (closes #23048)
authorBenjamin Peterson <benjamin@python.org>
Sat, 13 Dec 2014 21:06:19 +0000 (16:06 -0500)
committerBenjamin Peterson <benjamin@python.org>
Sat, 13 Dec 2014 21:06:19 +0000 (16:06 -0500)
Lib/test/test_dis.py
Lib/test/test_sys_settrace.py
Misc/NEWS
Python/compile.c

index d1229fba6dbe65355f9e97988aeb2a5f87c9b243..b8daff725ccb541c87afc77dd0245d8773a2ef06 100644 (file)
@@ -178,15 +178,16 @@ dis_compound_stmt_str = """\
   1           0 LOAD_CONST               0 (0)
               3 STORE_NAME               0 (x)
 
-  2           6 SETUP_LOOP              13 (to 22)
+  2           6 SETUP_LOOP              14 (to 23)
 
   3     >>    9 LOAD_NAME                0 (x)
              12 LOAD_CONST               1 (1)
              15 INPLACE_ADD
              16 STORE_NAME               0 (x)
              19 JUMP_ABSOLUTE            9
-        >>   22 LOAD_CONST               2 (None)
-             25 RETURN_VALUE
+             22 POP_BLOCK
+        >>   23 LOAD_CONST               2 (None)
+             26 RETURN_VALUE
 """
 
 dis_traceback = """\
index f0b0b8290af72cfd7b5a6959a0f153087fd3ffae..ae8f845ee1bdab1dbc29370636e3c6186163a995 100644 (file)
@@ -579,6 +579,15 @@ def jump_in_nested_finally(output):
 jump_in_nested_finally.jump = (4, 9)
 jump_in_nested_finally.output = [2, 9]
 
+def jump_infinite_while_loop(output):
+    output.append(1)
+    while 1:
+        output.append(2)
+    output.append(3)
+
+jump_infinite_while_loop.jump = (3, 4)
+jump_infinite_while_loop.output = [1, 3]
+
 # The second set of 'jump' tests are for things that are not allowed:
 
 def no_jump_too_far_forwards(output):
@@ -755,6 +764,8 @@ class JumpTestCase(unittest.TestCase):
         self.run_test(jump_to_same_line)
     def test_07_jump_in_nested_finally(self):
         self.run_test(jump_in_nested_finally)
+    def test_jump_infinite_while_loop(self):
+        self.run_test(jump_infinite_while_loop)
     def test_08_no_jump_too_far_forwards(self):
         self.run_test(no_jump_too_far_forwards)
     def test_09_no_jump_too_far_backwards(self):
index 77712315dcda1bf9dace2a4da1fdbb98f7c79a7a..2d1b9639b38786b7eaea3d12f471a40a833642f7 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -11,6 +11,8 @@ Release date: TBA
 Core and Builtins
 -----------------
 
+- Issue #23048: Fix jumping out of an infinite while loop in the pdb.
+
 - Issue #20335: bytes constructor now raises TypeError when encoding or errors
   is specified with non-string argument.  Based on patch by Renaud Blanch.
 
index ec7a4acd88f9aaeb709010bc52d188feccb3856d..b07c15647e4f432c5355c236dec98f2875b99de9 100644 (file)
@@ -2029,10 +2029,9 @@ compiler_while(struct compiler *c, stmt_ty s)
        if there is no else clause ?
     */
 
-    if (constant == -1) {
+    if (constant == -1)
         compiler_use_next_block(c, anchor);
-        ADDOP(c, POP_BLOCK);
-    }
+    ADDOP(c, POP_BLOCK);
     compiler_pop_fblock(c, LOOP, loop);
     if (orelse != NULL) /* what if orelse is just pass? */
         VISIT_SEQ(c, stmt, s->v.While.orelse);