@@ -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
22252227class 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
33433347type_checks = {
33443348 '&PyLong_Type' : ('PyLong_Check' , 'int' ),
0 commit comments