@@ -1966,15 +1966,6 @@ def dump(self):
1966
1966
extensions ['py' ] = PythonLanguage
1967
1967
1968
1968
1969
- # maps strings to callables.
1970
- # these callables must be of the form:
1971
- # def foo(*, ...)
1972
- # The callable may have any number of keyword-only parameters.
1973
- # The callable must return a CConverter object.
1974
- # The callable should not call builtins.print.
1975
- return_converters = {}
1976
-
1977
-
1978
1969
def file_changed (filename : str , new_contents : str ) -> bool :
1979
1970
"""Return true if file contents changed (meaning we must update it)"""
1980
1971
try :
@@ -3005,6 +2996,16 @@ def parser_name(self):
3005
2996
# note however that they will never be called with keyword-only parameters.
3006
2997
legacy_converters : ConverterDict = {}
3007
2998
2999
+ # maps strings to callables.
3000
+ # these callables must be of the form:
3001
+ # def foo(*, ...)
3002
+ # The callable may have any number of keyword-only parameters.
3003
+ # The callable must return a CReturnConverter object.
3004
+ # The callable should not call builtins.print.
3005
+ ReturnConverterType = Callable [..., "CReturnConverter" ]
3006
+ ReturnConverterDict = dict [str , ReturnConverterType ]
3007
+ return_converters : ReturnConverterDict = {}
3008
+
3008
3009
TypeSet = set [bltns .type [Any ]]
3009
3010
3010
3011
@@ -3966,8 +3967,10 @@ def set_template_dict(self, template_dict):
3966
3967
template_dict ['base_type_ptr' ] = type_ptr
3967
3968
3968
3969
3969
-
3970
- def add_c_return_converter (f , name = None ):
3970
+ def add_c_return_converter (
3971
+ f : ReturnConverterType ,
3972
+ name : str | None = None
3973
+ ) -> ReturnConverterType :
3971
3974
if not name :
3972
3975
name = f .__name__
3973
3976
if not name .endswith ('_return_converter' ):
@@ -3978,9 +3981,15 @@ def add_c_return_converter(f, name=None):
3978
3981
3979
3982
3980
3983
class CReturnConverterAutoRegister (type ):
3981
- def __init__ (cls , name , bases , classdict ):
3984
+ def __init__ (
3985
+ cls : ReturnConverterType ,
3986
+ name : str ,
3987
+ bases : tuple [type , ...],
3988
+ classdict : dict [str , Any ]
3989
+ ) -> None :
3982
3990
add_c_return_converter (cls )
3983
3991
3992
+
3984
3993
class CReturnConverter (metaclass = CReturnConverterAutoRegister ):
3985
3994
3986
3995
# The C type to use for this variable.
@@ -3992,19 +4001,23 @@ class CReturnConverter(metaclass=CReturnConverterAutoRegister):
3992
4001
# Or the magic value "unspecified" if there is no default.
3993
4002
default : object = None
3994
4003
3995
- def __init__ (self , * , py_default = None , ** kwargs ):
4004
+ def __init__ (
4005
+ self ,
4006
+ * ,
4007
+ py_default : str | None = None ,
4008
+ ** kwargs
4009
+ ) -> None :
3996
4010
self .py_default = py_default
3997
4011
try :
3998
4012
self .return_converter_init (** kwargs )
3999
4013
except TypeError as e :
4000
4014
s = ', ' .join (name + '=' + repr (value ) for name , value in kwargs .items ())
4001
4015
sys .exit (self .__class__ .__name__ + '(' + s + ')\n ' + str (e ))
4002
4016
4003
- def return_converter_init (self ):
4004
- pass
4017
+ def return_converter_init (self ) -> None : ...
4005
4018
4006
- def declare (self , data ) :
4007
- line = []
4019
+ def declare (self , data : CRenderData ) -> None :
4020
+ line : list [ str ] = []
4008
4021
add = line .append
4009
4022
add (self .type )
4010
4023
if not self .type .endswith ('*' ):
@@ -4013,74 +4026,101 @@ def declare(self, data):
4013
4026
data .declarations .append ('' .join (line ))
4014
4027
data .return_value = data .converter_retval
4015
4028
4016
- def err_occurred_if (self , expr , data ):
4029
+ def err_occurred_if (
4030
+ self ,
4031
+ expr : str ,
4032
+ data : CRenderData
4033
+ ) -> None :
4017
4034
line = f'if (({ expr } ) && PyErr_Occurred()) {{\n goto exit;\n }}\n '
4018
4035
data .return_conversion .append (line )
4019
4036
4020
- def err_occurred_if_null_pointer (self , variable , data ):
4037
+ def err_occurred_if_null_pointer (
4038
+ self ,
4039
+ variable : str ,
4040
+ data : CRenderData
4041
+ ) -> None :
4021
4042
line = f'if ({ variable } == NULL) {{\n goto exit;\n }}\n '
4022
4043
data .return_conversion .append (line )
4023
4044
4024
- def render (self , function , data ):
4025
- """
4026
- function is a clinic.Function instance.
4027
- data is a CRenderData instance.
4028
- """
4029
- pass
4045
+ def render (
4046
+ self ,
4047
+ function : Function ,
4048
+ data : CRenderData
4049
+ ) -> None : ...
4050
+
4030
4051
4031
4052
add_c_return_converter (CReturnConverter , 'object' )
4032
4053
4054
+
4033
4055
class bool_return_converter (CReturnConverter ):
4034
4056
type = 'int'
4035
4057
4036
- def render (self , function , data ):
4058
+ def render (
4059
+ self ,
4060
+ function : Function ,
4061
+ data : CRenderData
4062
+ ) -> None :
4037
4063
self .declare (data )
4038
4064
self .err_occurred_if (f"{ data .converter_retval } == -1" , data )
4039
4065
data .return_conversion .append (
4040
4066
f'return_value = PyBool_FromLong((long){ data .converter_retval } );\n '
4041
4067
)
4042
4068
4069
+
4043
4070
class long_return_converter (CReturnConverter ):
4044
4071
type = 'long'
4045
4072
conversion_fn = 'PyLong_FromLong'
4046
4073
cast = ''
4047
4074
unsigned_cast = ''
4048
4075
4049
- def render (self , function , data ):
4076
+ def render (
4077
+ self ,
4078
+ function : Function ,
4079
+ data : CRenderData
4080
+ ) -> None :
4050
4081
self .declare (data )
4051
4082
self .err_occurred_if (f"{ data .converter_retval } == { self .unsigned_cast } -1" , data )
4052
4083
data .return_conversion .append (
4053
4084
f'return_value = { self .conversion_fn } ({ self .cast } { data .converter_retval } );\n '
4054
4085
)
4055
4086
4087
+
4056
4088
class int_return_converter (long_return_converter ):
4057
4089
type = 'int'
4058
4090
cast = '(long)'
4059
4091
4092
+
4060
4093
class init_return_converter (long_return_converter ):
4061
4094
"""
4062
4095
Special return converter for __init__ functions.
4063
4096
"""
4064
4097
type = 'int'
4065
4098
cast = '(long)'
4066
4099
4067
- def render (self , function , data ):
4068
- pass
4100
+ def render (
4101
+ self ,
4102
+ function : Function ,
4103
+ data : CRenderData
4104
+ ) -> None : ...
4105
+
4069
4106
4070
4107
class unsigned_long_return_converter (long_return_converter ):
4071
4108
type = 'unsigned long'
4072
4109
conversion_fn = 'PyLong_FromUnsignedLong'
4073
4110
unsigned_cast = '(unsigned long)'
4074
4111
4112
+
4075
4113
class unsigned_int_return_converter (unsigned_long_return_converter ):
4076
4114
type = 'unsigned int'
4077
4115
cast = '(unsigned long)'
4078
4116
unsigned_cast = '(unsigned int)'
4079
4117
4118
+
4080
4119
class Py_ssize_t_return_converter (long_return_converter ):
4081
4120
type = 'Py_ssize_t'
4082
4121
conversion_fn = 'PyLong_FromSsize_t'
4083
4122
4123
+
4084
4124
class size_t_return_converter (long_return_converter ):
4085
4125
type = 'size_t'
4086
4126
conversion_fn = 'PyLong_FromSize_t'
@@ -4091,13 +4131,18 @@ class double_return_converter(CReturnConverter):
4091
4131
type = 'double'
4092
4132
cast = ''
4093
4133
4094
- def render (self , function , data ):
4134
+ def render (
4135
+ self ,
4136
+ function : Function ,
4137
+ data : CRenderData
4138
+ ) -> None :
4095
4139
self .declare (data )
4096
4140
self .err_occurred_if (f"{ data .converter_retval } == -1.0" , data )
4097
4141
data .return_conversion .append (
4098
4142
f'return_value = PyFloat_FromDouble({ self .cast } { data .converter_retval } );\n '
4099
4143
)
4100
4144
4145
+
4101
4146
class float_return_converter (double_return_converter ):
4102
4147
type = 'float'
4103
4148
cast = '(double)'
0 commit comments