mirror of
https://github.com/python/cpython.git
synced 2025-10-06 23:21:06 +00:00
gh-113054: Compiler no longer replaces a redundant jump with no line number by a NOP (#113139)
This commit is contained in:
parent
76d757b38b
commit
e51b400945
3 changed files with 22 additions and 1 deletions
|
@ -444,6 +444,10 @@ class TestSpecifics(unittest.TestCase):
|
||||||
self.assertIn("_A__mangled_mod", A.f.__code__.co_varnames)
|
self.assertIn("_A__mangled_mod", A.f.__code__.co_varnames)
|
||||||
self.assertIn("__package__", A.f.__code__.co_varnames)
|
self.assertIn("__package__", A.f.__code__.co_varnames)
|
||||||
|
|
||||||
|
def test_condition_expression_with_dead_blocks_compiles(self):
|
||||||
|
# See gh-113054
|
||||||
|
compile('if (5 if 5 else T): 0', '<eval>', 'exec')
|
||||||
|
|
||||||
def test_compile_invalid_namedexpr(self):
|
def test_compile_invalid_namedexpr(self):
|
||||||
# gh-109351
|
# gh-109351
|
||||||
m = ast.Module(
|
m = ast.Module(
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fixed bug where a redundant NOP is not removed, causing an assertion to fail
|
||||||
|
in the compiler in debug mode.
|
|
@ -1110,7 +1110,10 @@ remove_redundant_jumps(cfg_builder *g) {
|
||||||
* of that jump. If it is, then the jump instruction is redundant and
|
* of that jump. If it is, then the jump instruction is redundant and
|
||||||
* can be deleted.
|
* can be deleted.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
assert(no_empty_basic_blocks(g));
|
assert(no_empty_basic_blocks(g));
|
||||||
|
|
||||||
|
bool remove_empty_blocks = false;
|
||||||
for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) {
|
for (basicblock *b = g->g_entryblock; b != NULL; b = b->b_next) {
|
||||||
cfg_instr *last = basicblock_last_instr(b);
|
cfg_instr *last = basicblock_last_instr(b);
|
||||||
assert(last != NULL);
|
assert(last != NULL);
|
||||||
|
@ -1122,10 +1125,22 @@ remove_redundant_jumps(cfg_builder *g) {
|
||||||
}
|
}
|
||||||
if (last->i_target == b->b_next) {
|
if (last->i_target == b->b_next) {
|
||||||
assert(b->b_next->b_iused);
|
assert(b->b_next->b_iused);
|
||||||
INSTR_SET_OP0(last, NOP);
|
if (last->i_loc.lineno == NO_LOCATION.lineno) {
|
||||||
|
b->b_iused--;
|
||||||
|
if (b->b_iused == 0) {
|
||||||
|
remove_empty_blocks = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
INSTR_SET_OP0(last, NOP);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (remove_empty_blocks) {
|
||||||
|
eliminate_empty_basic_blocks(g);
|
||||||
|
}
|
||||||
|
assert(no_empty_basic_blocks(g));
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue