mirror of https://github.com/python/cpython
gh-124871: fix 'visited' tracking in compiler's reachability analysis (#124952)
This commit is contained in:
parent
994051e086
commit
f474391b26
|
@ -479,6 +479,19 @@ class TestSpecifics(unittest.TestCase):
|
|||
x = 2
|
||||
"""), '<eval>', 'exec')
|
||||
|
||||
def test_try_except_in_while_with_chained_condition_compiles(self):
|
||||
# see gh-124871
|
||||
compile(textwrap.dedent("""
|
||||
name_1, name_2, name_3 = 1, 2, 3
|
||||
while name_3 <= name_2 > name_1:
|
||||
try:
|
||||
raise
|
||||
except:
|
||||
pass
|
||||
finally:
|
||||
pass
|
||||
"""), '<eval>', 'exec')
|
||||
|
||||
def test_compile_invalid_namedexpr(self):
|
||||
# gh-109351
|
||||
m = ast.Module(
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Fix compiler bug (in some versions of 3.13) where an assertion fails during reachability
|
||||
analysis.
|
|
@ -1001,13 +1001,14 @@ remove_unreachable(basicblock *entryblock) {
|
|||
basicblock **sp = stack;
|
||||
entryblock->b_predecessors = 1;
|
||||
*sp++ = entryblock;
|
||||
entryblock->b_visited = 1;
|
||||
while (sp > stack) {
|
||||
basicblock *b = *(--sp);
|
||||
b->b_visited = 1;
|
||||
if (b->b_next && BB_HAS_FALLTHROUGH(b)) {
|
||||
if (!b->b_next->b_visited) {
|
||||
assert(b->b_next->b_predecessors == 0);
|
||||
*sp++ = b->b_next;
|
||||
b->b_next->b_visited = 1;
|
||||
}
|
||||
b->b_next->b_predecessors++;
|
||||
}
|
||||
|
@ -1017,8 +1018,8 @@ remove_unreachable(basicblock *entryblock) {
|
|||
if (is_jump(instr) || is_block_push(instr)) {
|
||||
target = instr->i_target;
|
||||
if (!target->b_visited) {
|
||||
assert(target->b_predecessors == 0 || target == b->b_next);
|
||||
*sp++ = target;
|
||||
target->b_visited = 1;
|
||||
}
|
||||
target->b_predecessors++;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue