mirror of
https://github.com/python/cpython.git
synced 2025-09-26 10:19:53 +00:00
[3.13] gh-120225: fix crash in compiler on empty block at end of exception handler (GH-120235) (#120249)
gh-120225: fix crash in compiler on empty block at end of exception handler (GH-120235)
(cherry picked from commit 4fc82b6d3b
)
Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com>
This commit is contained in:
parent
6238174e47
commit
3be7e91d03
3 changed files with 13 additions and 6 deletions
|
@ -1409,6 +1409,16 @@ class TestSpecifics(unittest.TestCase):
|
||||||
for kw in ("except", "except*"):
|
for kw in ("except", "except*"):
|
||||||
exec(code % kw, g, l);
|
exec(code % kw, g, l);
|
||||||
|
|
||||||
|
def test_regression_gh_120225(self):
|
||||||
|
async def name_4():
|
||||||
|
match b'':
|
||||||
|
case True:
|
||||||
|
pass
|
||||||
|
case name_5 if f'e':
|
||||||
|
{name_3: name_4 async for name_2 in name_5}
|
||||||
|
case []:
|
||||||
|
pass
|
||||||
|
[[]]
|
||||||
|
|
||||||
@requires_debug_ranges()
|
@requires_debug_ranges()
|
||||||
class TestSourcePositions(unittest.TestCase):
|
class TestSourcePositions(unittest.TestCase):
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Fix crash in compiler on empty block at end of exception handler.
|
|
@ -2276,15 +2276,11 @@ push_cold_blocks_to_end(cfg_builder *g) {
|
||||||
if (!IS_LABEL(b->b_next->b_label)) {
|
if (!IS_LABEL(b->b_next->b_label)) {
|
||||||
b->b_next->b_label.id = next_lbl++;
|
b->b_next->b_label.id = next_lbl++;
|
||||||
}
|
}
|
||||||
cfg_instr *prev_instr = basicblock_last_instr(b);
|
|
||||||
// b cannot be empty because at the end of an exception handler
|
|
||||||
// there is always a POP_EXCEPT + RERAISE/RETURN
|
|
||||||
assert(prev_instr);
|
|
||||||
|
|
||||||
basicblock_addop(explicit_jump, JUMP_NO_INTERRUPT, b->b_next->b_label.id,
|
basicblock_addop(explicit_jump, JUMP_NO_INTERRUPT, b->b_next->b_label.id,
|
||||||
prev_instr->i_loc);
|
NO_LOCATION);
|
||||||
explicit_jump->b_cold = 1;
|
explicit_jump->b_cold = 1;
|
||||||
explicit_jump->b_next = b->b_next;
|
explicit_jump->b_next = b->b_next;
|
||||||
|
explicit_jump->b_predecessors = 1;
|
||||||
b->b_next = explicit_jump;
|
b->b_next = explicit_jump;
|
||||||
|
|
||||||
/* set target */
|
/* set target */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue