mirror of
https://github.com/python/cpython.git
synced 2025-11-09 01:51:26 +00:00
[3.11] GH-103971: Fix incorrect locations for code following case blocks
This commit is contained in:
parent
4219074127
commit
fee3c91a19
3 changed files with 16 additions and 0 deletions
|
|
@ -3151,6 +3151,19 @@ def f(command): # 0
|
||||||
self.assertListEqual(self._trace(f, "go x"), [1, 2, 3])
|
self.assertListEqual(self._trace(f, "go x"), [1, 2, 3])
|
||||||
self.assertListEqual(self._trace(f, "spam"), [1, 2, 3])
|
self.assertListEqual(self._trace(f, "spam"), [1, 2, 3])
|
||||||
|
|
||||||
|
def test_unreachable_code(self):
|
||||||
|
def f(command): # 0
|
||||||
|
match command: # 1
|
||||||
|
case 1: # 2
|
||||||
|
if False: # 3
|
||||||
|
return 1 # 4
|
||||||
|
case _: # 5
|
||||||
|
if False: # 6
|
||||||
|
return 0 # 7
|
||||||
|
|
||||||
|
self.assertListEqual(self._trace(f, 1), [1, 2, 3])
|
||||||
|
self.assertListEqual(self._trace(f, 0), [1, 2, 5, 6])
|
||||||
|
|
||||||
def test_parser_deeply_nested_patterns(self):
|
def test_parser_deeply_nested_patterns(self):
|
||||||
# Deeply nested patterns can cause exponential backtracking when parsing.
|
# Deeply nested patterns can cause exponential backtracking when parsing.
|
||||||
# See gh-93671 for more information.
|
# See gh-93671 for more information.
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
Fix an issue where incorrect locations numbers could be assigned to code following ``case`` blocks.
|
||||||
|
|
@ -7057,6 +7057,7 @@ compiler_match_inner(struct compiler *c, stmt_ty s, pattern_context *pc)
|
||||||
ADDOP(c, POP_TOP);
|
ADDOP(c, POP_TOP);
|
||||||
}
|
}
|
||||||
VISIT_SEQ(c, stmt, m->body);
|
VISIT_SEQ(c, stmt, m->body);
|
||||||
|
UNSET_LOC(c);
|
||||||
ADDOP_JUMP(c, JUMP, end);
|
ADDOP_JUMP(c, JUMP, end);
|
||||||
// If the pattern fails to match, we want the line number of the
|
// If the pattern fails to match, we want the line number of the
|
||||||
// cleanup to be associated with the failed pattern, not the last line
|
// cleanup to be associated with the failed pattern, not the last line
|
||||||
|
|
@ -7081,6 +7082,7 @@ compiler_match_inner(struct compiler *c, stmt_ty s, pattern_context *pc)
|
||||||
RETURN_IF_FALSE(compiler_jump_if(c, m->guard, end, 0));
|
RETURN_IF_FALSE(compiler_jump_if(c, m->guard, end, 0));
|
||||||
}
|
}
|
||||||
VISIT_SEQ(c, stmt, m->body);
|
VISIT_SEQ(c, stmt, m->body);
|
||||||
|
UNSET_LOC(c);
|
||||||
}
|
}
|
||||||
compiler_use_next_block(c, end);
|
compiler_use_next_block(c, end);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue