From 7a6a97352d9a99e83e6beca729d14bb6ca542d12 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Sat, 13 Dec 2014 16:06:19 -0500 Subject: [PATCH] pop the loop block even for infinite while loops (closes #23048) --- Lib/test/test_sys_settrace.py | 11 +++++++++++ Misc/NEWS | 2 ++ Python/compile.c | 5 ++--- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index 9c7bcef2e7..1eea7862da 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -551,6 +551,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): @@ -723,6 +732,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): diff --git a/Misc/NEWS b/Misc/NEWS index 3f86e90873..c0c8603724 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ What's New in Python 2.7.10? Core and Builtins ----------------- +- Issue #23048: Fix jumping out of an infinite while loop in the pdb. + Library ------- diff --git a/Python/compile.c b/Python/compile.c index 9d9e62904c..1f59c8c9a4 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1716,10 +1716,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); -- 2.50.1