mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
gh-113297: Fix segfault in compiler for with statement with 19 context managers (#113327)
This commit is contained in:
parent
9afb0e1606
commit
c31943af16
3 changed files with 29 additions and 1 deletions
|
@ -2017,6 +2017,7 @@ Invalid expressions in type scopes:
|
|||
|
||||
import re
|
||||
import doctest
|
||||
import textwrap
|
||||
import unittest
|
||||
|
||||
from test import support
|
||||
|
@ -2279,6 +2280,31 @@ if x:
|
|||
code += f"{' '*4*12}pass"
|
||||
self._check_error(code, "too many statically nested blocks")
|
||||
|
||||
@support.cpython_only
|
||||
def test_with_statement_many_context_managers(self):
|
||||
# See gh-113297
|
||||
|
||||
def get_code(n):
|
||||
code = textwrap.dedent("""
|
||||
def bug():
|
||||
with (
|
||||
a
|
||||
""")
|
||||
for i in range(n):
|
||||
code += f" as a{i}, a\n"
|
||||
code += "): yield a"
|
||||
return code
|
||||
|
||||
CO_MAXBLOCKS = 20 # static nesting limit of the compiler
|
||||
|
||||
for n in range(CO_MAXBLOCKS):
|
||||
with self.subTest(f"within range: {n=}"):
|
||||
compile(get_code(n), "<string>", "exec")
|
||||
|
||||
for n in range(CO_MAXBLOCKS, CO_MAXBLOCKS + 5):
|
||||
with self.subTest(f"out of range: {n=}"):
|
||||
self._check_error(get_code(n), "too many statically nested blocks")
|
||||
|
||||
def test_barry_as_flufl_with_syntax_errors(self):
|
||||
# The "barry_as_flufl" rule can produce some "bugs-at-a-distance" if
|
||||
# is reading the wrong token in the presence of syntax errors later
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue