summaryrefslogtreecommitdiffstats
path: root/Python/compile.c
diff options
context:
space:
mode:
authorIrit Katriel <1055913+iritkatriel@users.noreply.github.com>2022-11-24 10:59:07 (GMT)
committerGitHub <noreply@github.com>2022-11-24 10:59:07 (GMT)
commitae185fdcca9d48aef425468de8a8a31300280932 (patch)
tree23e9469659596a797aa7f9922a2e2992016886a2 /Python/compile.c
parent5f4ae86a639fb84260d622e31468da21dc468265 (diff)
downloadcpython-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.c20
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;
}