@@ -884,6 +884,7 @@ def parser_body(
884884 displayname = parameters [0 ].get_displayname (0 )
885885 parsearg = converters [0 ].parse_arg (argname , displayname , limited_capi = limited_capi )
886886 if parsearg is None :
887+ converters [0 ].use_converter ()
887888 parsearg = """
888889 if (!PyArg_Parse(%s, "{format_units}:{name}", {parse_arguments})) {{
889890 goto exit;
@@ -1016,6 +1017,9 @@ def parser_body(
10161017 if has_optional :
10171018 parser_code .append ("skip_optional:" )
10181019 else :
1020+ for parameter in parameters :
1021+ parameter .converter .use_converter ()
1022+
10191023 if limited_capi :
10201024 fastcall = False
10211025 if fastcall :
@@ -1184,6 +1188,9 @@ def parser_body(
11841188 if add_label :
11851189 parser_code .append ("%s:" % add_label )
11861190 else :
1191+ for parameter in parameters :
1192+ parameter .converter .use_converter ()
1193+
11871194 declarations = declare_parser (f , clinic = clinic ,
11881195 hasformat = True ,
11891196 limited_capi = limited_capi )
@@ -3155,8 +3162,13 @@ def format_code(self, fmt: str, *,
31553162 fmt = fmt .replace ('{bad_argument2}' , bad_argument2 )
31563163 return fmt .format (argname = argname , paramname = self .parser_name , ** kwargs )
31573164
3165+ def use_converter (self ) -> None :
3166+ """Method called when self.converter is used to parse an argument."""
3167+ pass
3168+
31583169 def parse_arg (self , argname : str , displayname : str , * , limited_capi : bool ) -> str | None :
31593170 if self .format_unit == 'O&' :
3171+ self .use_converter ()
31603172 return self .format_code ("""
31613173 if (!{converter}({argname}, &{paramname})) {{{{
31623174 goto exit;
@@ -3435,6 +3447,9 @@ def converter_init(self, *, bitwise: bool = False) -> None:
34353447 self .format_unit = 'H'
34363448 else :
34373449 self .converter = '_PyLong_UnsignedShort_Converter'
3450+
3451+ def use_converter (self ) -> None :
3452+ if self .converter == '_PyLong_UnsignedShort_Converter' :
34383453 self .add_include ('pycore_long.h' ,
34393454 '_PyLong_UnsignedShort_Converter()' )
34403455
@@ -3519,6 +3534,9 @@ def converter_init(self, *, bitwise: bool = False) -> None:
35193534 self .format_unit = 'I'
35203535 else :
35213536 self .converter = '_PyLong_UnsignedInt_Converter'
3537+
3538+ def use_converter (self ) -> None :
3539+ if self .converter == '_PyLong_UnsignedInt_Converter' :
35223540 self .add_include ('pycore_long.h' ,
35233541 '_PyLong_UnsignedInt_Converter()' )
35243542
@@ -3577,6 +3595,9 @@ def converter_init(self, *, bitwise: bool = False) -> None:
35773595 self .format_unit = 'k'
35783596 else :
35793597 self .converter = '_PyLong_UnsignedLong_Converter'
3598+
3599+ def use_converter (self ) -> None :
3600+ if self .converter == '_PyLong_UnsignedLong_Converter' :
35803601 self .add_include ('pycore_long.h' ,
35813602 '_PyLong_UnsignedLong_Converter()' )
35823603
@@ -3630,6 +3651,9 @@ def converter_init(self, *, bitwise: bool = False) -> None:
36303651 self .format_unit = 'K'
36313652 else :
36323653 self .converter = '_PyLong_UnsignedLongLong_Converter'
3654+
3655+ def use_converter (self ) -> None :
3656+ if self .converter == '_PyLong_UnsignedLongLong_Converter' :
36333657 self .add_include ('pycore_long.h' ,
36343658 '_PyLong_UnsignedLongLong_Converter()' )
36353659
@@ -3664,20 +3688,23 @@ def converter_init(self, *, accept: TypeSet = {int}) -> None:
36643688 if accept == {int }:
36653689 self .format_unit = 'n'
36663690 self .default_type = int
3667- self .add_include ('pycore_abstract.h' , '_PyNumber_Index()' )
36683691 elif accept == {int , NoneType }:
36693692 self .converter = '_Py_convert_optional_to_ssize_t'
3670- self .add_include ('pycore_abstract.h' ,
3671- '_Py_convert_optional_to_ssize_t()' )
36723693 else :
36733694 fail (f"Py_ssize_t_converter: illegal 'accept' argument { accept !r} " )
36743695
3696+ def use_converter (self ) -> None :
3697+ if self .converter == '_Py_convert_optional_to_ssize_t' :
3698+ self .add_include ('pycore_abstract.h' ,
3699+ '_Py_convert_optional_to_ssize_t()' )
3700+
36753701 def parse_arg (self , argname : str , displayname : str , * , limited_capi : bool ) -> str | None :
36763702 if self .format_unit == 'n' :
36773703 if limited_capi :
36783704 PyNumber_Index = 'PyNumber_Index'
36793705 else :
36803706 PyNumber_Index = '_PyNumber_Index'
3707+ self .add_include ('pycore_abstract.h' , '_PyNumber_Index()' )
36813708 return self .format_code ("""
36823709 {{{{
36833710 Py_ssize_t ival = -1;
@@ -3771,7 +3798,7 @@ class size_t_converter(CConverter):
37713798 converter = '_PyLong_Size_t_Converter'
37723799 c_ignored_default = "0"
37733800
3774- def converter_init (self , * , accept : TypeSet = { int , NoneType } ) -> None :
3801+ def use_converter (self ) -> None :
37753802 self .add_include ('pycore_long.h' ,
37763803 '_PyLong_Size_t_Converter()' )
37773804
@@ -3800,6 +3827,10 @@ class fildes_converter(CConverter):
38003827 type = 'int'
38013828 converter = '_PyLong_FileDescriptor_Converter'
38023829
3830+ def use_converter (self ) -> None :
3831+ self .add_include ('pycore_fileutils.h' ,
3832+ '_PyLong_FileDescriptor_Converter()' )
3833+
38033834 def parse_arg (self , argname : str , displayname : str , * , limited_capi : bool ) -> str | None :
38043835 if limited_capi :
38053836 return self .format_code ("""
@@ -3810,8 +3841,6 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
38103841 """ ,
38113842 argname = argname )
38123843 else :
3813- self .add_include ('pycore_fileutils.h' ,
3814- '_PyLong_FileDescriptor_Converter()' )
38153844 return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
38163845
38173846
0 commit comments