diff options
author | Irit Katriel <1055913+iritkatriel@users.noreply.github.com> | 2022-11-24 10:59:07 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-24 10:59:07 (GMT) |
commit | ae185fdcca9d48aef425468de8a8a31300280932 (patch) | |
tree | 23e9469659596a797aa7f9922a2e2992016886a2 /Python/compile.c | |
parent | 5f4ae86a639fb84260d622e31468da21dc468265 (diff) | |
download | cpython-ae185fdcca9d48aef425468de8a8a31300280932.zip cpython-ae185fdcca9d48aef425468de8a8a31300280932.tar.gz cpython-ae185fdcca9d48aef425468de8a8a31300280932.tar.bz2 |
gh-99708: fix bug where compiler crashes on if expression with an empty body block (GH-99732)
Diffstat (limited to 'Python/compile.c')
-rw-r--r-- | Python/compile.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/Python/compile.c b/Python/compile.c index 3663211..dd8596d 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -512,7 +512,7 @@ static int compiler_match(struct compiler *, stmt_ty); static int compiler_pattern_subpattern(struct compiler *, pattern_ty, pattern_context *); -static void remove_redundant_nops(basicblock *bb); +static int remove_redundant_nops(basicblock *bb); static PyCodeObject *assemble(struct compiler *, int addNone); @@ -8666,6 +8666,17 @@ static void propagate_line_numbers(basicblock *entryblock); #ifndef NDEBUG + +static bool +no_redundant_nops(cfg_builder *g) { + for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { + if (remove_redundant_nops(b) != 0) { + return false; + } + } + return true; +} + static bool no_redundant_jumps(cfg_builder *g) { for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { @@ -9435,7 +9446,7 @@ inline_small_exit_blocks(basicblock *bb) { return 0; } -static void +static int remove_redundant_nops(basicblock *bb) { /* Remove NOPs when legal to do so. */ int dest = 0; @@ -9483,7 +9494,9 @@ remove_redundant_nops(basicblock *bb) { prev_lineno = lineno; } assert(dest <= bb->b_iused); + int num_removed = bb->b_iused - dest; bb->b_iused = dest; + return num_removed; } static int @@ -9694,10 +9707,11 @@ optimize_cfg(cfg_builder *g, PyObject *consts, PyObject *const_cache) b->b_iused = 0; } } - eliminate_empty_basic_blocks(g); for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) { remove_redundant_nops(b); } + eliminate_empty_basic_blocks(g); + assert(no_redundant_nops(g)); if (remove_redundant_jumps(g) < 0) { return -1; } |