@@ -884,6 +884,7 @@ def parser_body(
884
884
displayname = parameters [0 ].get_displayname (0 )
885
885
parsearg = converters [0 ].parse_arg (argname , displayname , limited_capi = limited_capi )
886
886
if parsearg is None :
887
+ converters [0 ].use_converter ()
887
888
parsearg = """
888
889
if (!PyArg_Parse(%s, "{format_units}:{name}", {parse_arguments})) {{
889
890
goto exit;
@@ -1016,6 +1017,9 @@ def parser_body(
1016
1017
if has_optional :
1017
1018
parser_code .append ("skip_optional:" )
1018
1019
else :
1020
+ for parameter in parameters :
1021
+ parameter .converter .use_converter ()
1022
+
1019
1023
if limited_capi :
1020
1024
fastcall = False
1021
1025
if fastcall :
@@ -1184,6 +1188,9 @@ def parser_body(
1184
1188
if add_label :
1185
1189
parser_code .append ("%s:" % add_label )
1186
1190
else :
1191
+ for parameter in parameters :
1192
+ parameter .converter .use_converter ()
1193
+
1187
1194
declarations = declare_parser (f , clinic = clinic ,
1188
1195
hasformat = True ,
1189
1196
limited_capi = limited_capi )
@@ -3155,8 +3162,13 @@ def format_code(self, fmt: str, *,
3155
3162
fmt = fmt .replace ('{bad_argument2}' , bad_argument2 )
3156
31
8000
63
return fmt .format (argname = argname , paramname = self .parser_name , ** kwargs )
3157
3164
3165
+ def use_converter (self ) -> None :
3166
+ """Method called when self.converter is used to parse an argument."""
3167
+ pass
3168
+
3158
3169
def parse_arg (self , argname : str , displayname : str , * , limited_capi : bool ) -> str | None :
3159
3170
if self .format_unit == 'O&' :
3171
+ self .use_converter ()
3160
3172
return self .format_code ("""
3161
3173
if (!{converter}({argname}, &{paramname})) {{{{
3162
3174
goto exit;
@@ -3435,6 +3447,9 @@ def converter_init(self, *, bitwise: bool = False) -> None:
3435
3447
self .format_unit = 'H'
3436
3448
else :
3437
3449
self .converter = '_PyLong_UnsignedShort_Converter'
3450
+
3451
+ def use_converter (self ) -> None :
3452
+ if self .converter == '_PyLong_UnsignedShort_Converter' :
3438
3453
self .add_include ('pycore_long.h' ,
3439
3454
'_PyLong_UnsignedShort_Converter()' )
3440
3455
@@ -3519,6 +3534,9 @@ def converter_init(self, *, bitwise: bool = False) -> None:
3519
3534
self .format_unit = 'I'
3520
3535
else :
3521
3536
self .converter = '_PyLong_UnsignedInt_Converter'
3537
+
3538
+ def use_converter (self ) -> None :
3539
+ if self .converter == '_PyLong_UnsignedInt_Converter' :
3522
3540
self .add_include ('pycore_long.h' ,
3523
3541
'_PyLong_UnsignedInt_Converter()' )
3524
3542
@@ -3577,6 +3595,9 @@ def converter_init(self, *, bitwise: bool = False) -> None:
3577
3595
self .format_unit = 'k'
3578
3596
else :
3579
3597
self .converter = '_PyLong_UnsignedLong_Converter'
3598
+
3599
+ def use_converter (self ) -> None :
3600
+ if self .converter == '_PyLong_UnsignedLong_Converter' :
3580
3601
self .add_include ('pycore_long.h' ,
3581
3602
'_PyLong_UnsignedLong_Converter()' )
3582
3603
@@ -3630,6 +3651,9 @@ def converter_init(self, *, bitwise: bool = False) -> None:
3630
3651
self .format_unit = 'K'
3631
3652
else :
3632
3653
self .converter = '_PyLong_UnsignedLongLong_Converter'
3654
+
3655
+ def use_converter (self ) -> None :
3656
+ if self .converter == '_PyLong_UnsignedLongLong_Converter' :
3633
3657
self .add_include ('pycore_long.h' ,
3634
3658
'_PyLong_UnsignedLongLong_Converter()' )
3635
3659
@@ -3664,20 +3688,23 @@ def converter_init(self, *, accept: TypeSet = {int}) -> None:
3664
3688
if accept == {int }:
3665
3689
self .format_unit = 'n'
3666
3690
self .default_type = int
3667
- self .add_include ('pycore_abstract.h' , '_PyNumber_Index()' )
3668
3691
elif accept == {int , NoneType }:
3669
3692
self .converter = '_Py_convert_optional_to_ssize_t'
3670
- self .add_include ('pycore_abstract.h' ,
3671
- '_Py_convert_optional_to_ssize_t()' )
3672
3693
else :
3673
3694
fail (f"Py_ssize_t_converter: illegal 'accept' argument { accept !r} " )
3674
3695
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
+
3675
3701
def parse_arg (self , argname : str , displayname : str , * , limited_capi : bool ) -> str | None :
3676
3702
if self .format_unit == 'n' :
3677
3703
if limited_capi :
3678
3704
PyNumber_Index = 'PyNumber_Index'
3679
3705
else :
3680
3706
PyNumber_Index = '_PyNumber_Index'
3707
+ self .add_include ('pycore_abstract.h' , '_PyNumber_Index()' )
3681
3708
return self .format_code ("""
3682
3709
{{{{
3683
3710
Py_ssize_t ival = -1;
@@ -3771,7 +3798,7 @@ class size_t_converter(CConverter):
3771
3798
converter = '_PyLong_Size_t_Converter'
3772
3799
c_ignored_default = "0"
3773
3800
3774
- def converter_init (self , * , accept : TypeSet = { int , NoneType } ) -> None :
3801
+ def use_converter (self ) -> None :
3775
3802
self .add_include ('pycore_long.h' ,
3776
3803
'_PyLong_Size_t_Converter()' )
3777
3804
@@ -3800,6 +3827,10 @@ class fildes_converter(CConverter):
3800
3827
type = 'int'
3801
3828
converter = '_PyLong_FileDescriptor_Converter'
3802
3829
3830
+ def use_converter (self ) -> None :
3831
+ self .add_include ('pycore_fileutils.h' ,
3832
+ '_PyLong_FileDescriptor_Converter()' )
3833
+
3803
3834
def parse_arg (self , argname : str , displayname : str , * , limited_capi : bool ) -> str | None :
3804
3835
if limited_capi :
3805
3836
return self .format_code ("""
@@ -3810,8 +3841,6 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
3810
3841
""" ,
3811
3842
argname = argname )
3812
3843
else :
3813
- self .add_include ('pycore_fileutils.h' ,
3814
- '_PyLong_FileDescriptor_Converter()' )
3815
3844
return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
3816
3845
3817
3846
0 commit comments