Kaydet (Commit) 3cda0ed0 authored tarafından Benjamin Peterson's avatar Benjamin Peterson

pop the loop block even for infinite while loops (closes #23048)

üst db9b65d9
...@@ -178,15 +178,16 @@ dis_compound_stmt_str = """\ ...@@ -178,15 +178,16 @@ dis_compound_stmt_str = """\
1 0 LOAD_CONST 0 (0) 1 0 LOAD_CONST 0 (0)
3 STORE_NAME 0 (x) 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) 3 >> 9 LOAD_NAME 0 (x)
12 LOAD_CONST 1 (1) 12 LOAD_CONST 1 (1)
15 INPLACE_ADD 15 INPLACE_ADD
16 STORE_NAME 0 (x) 16 STORE_NAME 0 (x)
19 JUMP_ABSOLUTE 9 19 JUMP_ABSOLUTE 9
>> 22 LOAD_CONST 2 (None) 22 POP_BLOCK
25 RETURN_VALUE >> 23 LOAD_CONST 2 (None)
26 RETURN_VALUE
""" """
dis_traceback = """\ dis_traceback = """\
......
...@@ -579,6 +579,15 @@ def jump_in_nested_finally(output): ...@@ -579,6 +579,15 @@ def jump_in_nested_finally(output):
jump_in_nested_finally.jump = (4, 9) jump_in_nested_finally.jump = (4, 9)
jump_in_nested_finally.output = [2, 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: # The second set of 'jump' tests are for things that are not allowed:
def no_jump_too_far_forwards(output): def no_jump_too_far_forwards(output):
...@@ -755,6 +764,8 @@ class JumpTestCase(unittest.TestCase): ...@@ -755,6 +764,8 @@ class JumpTestCase(unittest.TestCase):
self.run_test(jump_to_same_line) self.run_test(jump_to_same_line)
def test_07_jump_in_nested_finally(self): def test_07_jump_in_nested_finally(self):
self.run_test(jump_in_nested_finally) 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): def test_08_no_jump_too_far_forwards(self):
self.run_test(no_jump_too_far_forwards) self.run_test(no_jump_too_far_forwards)
def test_09_no_jump_too_far_backwards(self): def test_09_no_jump_too_far_backwards(self):
......
...@@ -11,6 +11,8 @@ Release date: TBA ...@@ -11,6 +11,8 @@ Release date: TBA
Core and Builtins 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 - Issue #20335: bytes constructor now raises TypeError when encoding or errors
is specified with non-string argument. Based on patch by Renaud Blanch. is specified with non-string argument. Based on patch by Renaud Blanch.
......
...@@ -2029,10 +2029,9 @@ compiler_while(struct compiler *c, stmt_ty s) ...@@ -2029,10 +2029,9 @@ compiler_while(struct compiler *c, stmt_ty s)
if there is no else clause ? if there is no else clause ?
*/ */
if (constant == -1) { if (constant == -1)
compiler_use_next_block(c, anchor); compiler_use_next_block(c, anchor);
ADDOP(c, POP_BLOCK); ADDOP(c, POP_BLOCK);
}
compiler_pop_fblock(c, LOOP, loop); compiler_pop_fblock(c, LOOP, loop);
if (orelse != NULL) /* what if orelse is just pass? */ if (orelse != NULL) /* what if orelse is just pass? */
VISIT_SEQ(c, stmt, s->v.While.orelse); VISIT_SEQ(c, stmt, s->v.While.orelse);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment