Skip to content

Commit 5dff970

Browse files
committed
gh-113317: AC converter: Use add_include() in bad_argument()
* Rename the 'clinic' global variable to 'global_clinic'. * Make CConverter.add_include() smarter. Don't fail when adding exactly the same include twice. * Copy converters includes later in output_templates().
1 parent 7e49f27 commit 5dff970

1 file changed

Lines changed: 20 additions & 16 deletions

File tree

Tools/clinic/clinic.py

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,11 @@ def warn_or_fail(
116116
line_number: int | None = None,
117117
) -> None:
118118
joined = " ".join([str(a) for a in args])
119-
if clinic:
119+
if global_clinic:
120120
if filename is None:
121-
filename = clinic.filename
122-
if getattr(clinic, 'block_parser', None) and (line_number is None):
123-
line_number = clinic.block_parser.line_number
121+
filename = global_clinic.filename
122+
if getattr(global_clinic, 'block_parser', None) and (line_number is None):
123+
line_number = global_clinic.block_parser.line_number
124124
error = ClinicError(joined, filename=filename, lineno=line_number)
125125
if fail:
126126
raise error
@@ -818,12 +818,6 @@ def output_templates(
818818
del parameters[0]
819819
converters = [p.converter for p in parameters]
820820

821-
# Copy includes from parameters to Clinic
822-
for converter in converters:
823-
include = converter.include
824-
if include:
825-
clinic.add_include(include.filename, include.reason,
826-
condition=include.condition)
827821
if f.critical_section:
828822
clinic.add_include('pycore_critical_section.h', 'Py_BEGIN_CRITICAL_SECTION()')
829823
has_option_groups = parameters and (parameters[0].group or parameters[-1].group)
@@ -1455,6 +1449,14 @@ def parser_body(
14551449
if compiler_warning:
14561450
parser_definition = compiler_warning + "\n\n" + parser_definition
14571451

1452+
# Copy converters includes at the end, since includes can be
1453+
# added late
1454+
for converter in converters:
1455+
include = converter.include
1456+
if include is not None:
1457+
clinic.add_include(include.filename, include.reason,
1458+
condition=include.condition)
1459+
14581460
d = {
14591461
"docstring_prototype" : docstring_prototype,
14601462
"docstring_definition" : docstring_definition,
@@ -2221,7 +2223,7 @@ def __init__(self, clinic: Clinic) -> None: ...
22212223
def parse(self, block: Block) -> None: ...
22222224

22232225

2224-
clinic: Clinic | None = None
2226+
global_clinic: Clinic | None = None
22252227
class Clinic:
22262228

22272229
presets_text = """
@@ -2346,8 +2348,8 @@ def __init__(
23462348
assert name in self.destination_buffers
23472349
preset[name] = buffer
23482350

2349-
global clinic
2350-
clinic = self
2351+
global global_clinic
2352+
global_clinic = self
23512353

23522354
def add_include(self, name: str, reason: str,
23532355
*, condition: str | None = None) -> None:
@@ -3263,8 +3265,7 @@ def bad_argument(self, displayname: str, expected: str, *, limited_capi: bool, e
32633265
else:
32643266
if expected_literal:
32653267
expected = f'"{expected}"'
3266-
if clinic is not None:
3267-
clinic.add_include('pycore_modsupport.h', '_PyArg_BadArgument()')
3268+
self.add_include('pycore_modsupport.h', '_PyArg_BadArgument()')
32683269
return f'_PyArg_BadArgument("{{{{name}}}}", "{displayname}", {expected}, {{argname}});'
32693270

32703271
def format_code(self, fmt: str, *,
@@ -3336,9 +3337,12 @@ def parser_name(self) -> str:
33363337

33373338
def add_include(self, name: str, reason: str,
33383339
*, condition: str | None = None) -> None:
3340+
include = Include(name, reason, condition)
33393341
if self.include is not None:
3342+
if self.include == include:
3343+
return
33403344
raise ValueError("a converter only supports a single include")
3341-
self.include = Include(name, reason, condition)
3345+
self.include = include
33423346

33433347
type_checks = {
33443348
'&PyLong_Type': ('PyLong_Check', 'int'),

0 commit comments

Comments
 (0)