1717TypeSet = set [bltns .type [object ]]
1818
1919
20+ class BaseUnsignedIntConverter (CConverter ):
21+
22+ def use_converter (self ) -> None :
23+ if self .converter :
24+ self .add_include ('pycore_long.h' ,
25+ f'{ self .converter } ()' )
26+
27+ def parse_arg (self , argname : str , displayname : str , * , limited_capi : bool ) -> str | None :
28+ if not limited_capi :
29+ return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
30+ return self .format_code ("""
31+ {{{{
32+ Py_ssize_t _bytes = PyLong_AsNativeBytes({argname}, &{paramname}, sizeof({type}),
33+ Py_ASNATIVEBYTES_NATIVE_ENDIAN |
34+ Py_ASNATIVEBYTES_ALLOW_INDEX |
35+ Py_ASNATIVEBYTES_REJECT_NEGATIVE |
36+ Py_ASNATIVEBYTES_UNSIGNED_BUFFER);
37+ if (_bytes < 0) {{{{
38+ goto exit;
39+ }}}}
40+ if ((size_t)_bytes > sizeof({type})) {{{{
41+ PyErr_SetString(PyExc_OverflowError,
42+ "Python int too large for C {type}");
43+ goto exit;
44+ }}}}
45+ }}}}
46+ """ ,
47+ argname = argname ,
48+ type = self .type )
49+
50+
51+ class uint8_converter (BaseUnsignedIntConverter ):
52+ type = "uint8_t"
53+ converter = '_PyLong_UInt8_Converter'
54+
55+ class uint16_converter (BaseUnsignedIntConverter ):
56+ type = "uint16_t"
57+ converter = '_PyLong_UInt16_Converter'
58+
59+ class uint32_converter (BaseUnsignedIntConverter ):
60+ type = "uint32_t"
61+ converter = '_PyLong_UInt32_Converter'
62+
63+ class uint64_converter (BaseUnsignedIntConverter ):
64+ type = "uint64_t"
65+ converter = '_PyLong_UInt64_Converter'
66+
67+
2068class bool_converter (CConverter ):
2169 type = 'int'
2270 default_type = bool
@@ -211,29 +259,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
211259 return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
212260
213261
214- def format_inline_unsigned_int_converter (self : CConverter , argname : str ) -> str :
215- return self .format_code ("""
216- {{{{
217- Py_ssize_t _bytes = PyLong_AsNativeBytes({argname}, &{paramname}, sizeof({type}),
218- Py_ASNATIVEBYTES_NATIVE_ENDIAN |
219- Py_ASNATIVEBYTES_ALLOW_INDEX |
220- Py_ASNATIVEBYTES_REJECT_NEGATIVE |
221- Py_ASNATIVEBYTES_UNSIGNED_BUFFER);
222- if (_bytes < 0) {{{{
223- goto exit;
224- }}}}
225- if ((size_t)_bytes > sizeof({type})) {{{{
226- PyErr_SetString(PyExc_OverflowError,
227- "Python int too large for C {type}");
228- goto exit;
229- }}}}
230- }}}}
231- """ ,
232- argname = argname ,
233- type = self .type )
234-
235-
236- class unsigned_short_converter (CConverter ):
262+ class unsigned_short_converter (BaseUnsignedIntConverter ):
237263 type = 'unsigned short'
238264 default_type = int
239265 c_ignored_default = "0"
@@ -244,11 +270,6 @@ def converter_init(self, *, bitwise: bool = False) -> None:
244270 else :
245271 self .converter = '_PyLong_UnsignedShort_Converter'
246272
247- def use_converter (self ) -> None :
248- if self .converter == '_PyLong_UnsignedShort_Converter' :
249- self .add_include ('pycore_long.h' ,
250- '_PyLong_UnsignedShort_Converter()' )
251-
252273 def parse_arg (self , argname : str , displayname : str , * , limited_capi : bool ) -> str | None :
253274 if self .format_unit == 'H' :
254275 return self .format_code ("""
@@ -258,9 +279,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
258279 }}}}
259280 """ ,
260281 argname = argname )
261- if not limited_capi :
262- return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
263- return format_inline_unsigned_int_converter (self , argname )
282+ return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
264283
265284
266285@add_legacy_c_converter ('C' , accept = {str })
@@ -311,7 +330,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
311330 return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
312331
313332
314- class unsigned_int_converter (CConverter ):
333+ class unsigned_int_converter (BaseUnsignedIntConverter ):
315334 type = 'unsigned int'
316335 default_type = int
317336 c_ignored_default = "0"
@@ -322,11 +341,6 @@ def converter_init(self, *, bitwise: bool = False) -> None:
322341 else :
323342 self .converter = '_PyLong_UnsignedInt_Converter'
324343
325- def use_converter (self ) -> None :
326- if self .converter == '_PyLong_UnsignedInt_Converter' :
327- self .add_include ('pycore_long.h' ,
328- '_PyLong_UnsignedInt_Converter()' )
329-
330344 def parse_arg (self , argname : str , displayname : str , * , limited_capi : bool ) -> str | None :
331345 if self .format_unit == 'I' :
332346 return self .format_code ("""
@@ -336,9 +350,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
336350 }}}}
337351 """ ,
338352 argname = argname )
339- if not limited_capi :
340- return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
341- return format_inline_unsigned_int_converter (self , argname )
353+ return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
342354
343355
344356class long_converter (CConverter ):
@@ -359,7 +371,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
359371 return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
360372
361373
362- class unsigned_long_converter (CConverter ):
374+ class unsigned_long_converter (BaseUnsignedIntConverter ):
363375 type = 'unsigned long'
364376 default_type = int
365377 c_ignored_default = "0"
@@ -370,11 +382,6 @@ def converter_init(self, *, bitwise: bool = False) -> None:
370382 else :
371383 self .converter = '_PyLong_UnsignedLong_Converter'
372384
373- def use_converter (self ) -> None :
374- if self .converter == '_PyLong_UnsignedLong_Converter' :
375- self .add_include ('pycore_long.h' ,
376- '_PyLong_UnsignedLong_Converter()' )
377-
378385 def parse_arg (self , argname : str , displayname : str , * , limited_capi : bool ) -> str | None :
379386 if self .format_unit == 'k' :
380387 return self .format_code ("""
@@ -387,9 +394,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
387394 argname = argname ,
388395 bad_argument = self .bad_argument (displayname , 'int' , limited_capi = limited_capi ),
389396 )
390- if not limited_capi :
391- return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
392- return format_inline_unsigned_int_converter (self , argname )
397+ return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
393398
394399
395400class long_long_converter (CConverter ):
@@ -410,7 +415,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
410415 return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
411416
412417
413- class unsigned_long_long_converter (CConverter ):
418+ class unsigned_long_long_converter (BaseUnsignedIntConverter ):
414419 type = 'unsigned long long'
415420 default_type = int
416421 c_ignored_default = "0"
@@ -421,11 +426,6 @@ def converter_init(self, *, bitwise: bool = False) -> None:
421426 else :
422427 self .converter = '_PyLong_UnsignedLongLong_Converter'
423428
424- def use_converter (self ) -> None :
425- if self .converter == '_PyLong_UnsignedLongLong_Converter' :
426- self .add_include ('pycore_long.h' ,
427- '_PyLong_UnsignedLongLong_Converter()' )
428-
429429 def parse_arg (self , argname : str , displayname : str , * , limited_capi : bool ) -> str | None :
430430 if self .format_unit == 'K' :
431431 return self .format_code ("""
@@ -438,9 +438,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
438438 argname = argname ,
439439 bad_argument = self .bad_argument (displayname , 'int' , limited_capi = limited_capi ),
440440 )
441- if not limited_capi :
442- return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
443- return format_inline_unsigned_int_converter (self , argname )
441+ return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
444442
445443
446444class Py_ssize_t_converter (CConverter ):
@@ -557,15 +555,11 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
557555 argname = argname )
558556
559557
560- class size_t_converter (CConverter ):
558+ class size_t_converter (BaseUnsignedIntConverter ):
561559 type = 'size_t'
562560 converter = '_PyLong_Size_t_Converter'
563561 c_ignored_default = "0"
564562
565- def use_converter (self ) -> None :
566- self .add_include ('pycore_long.h' ,
567- '_PyLong_Size_t_Converter()' )
568-
569563 def parse_arg (self , argname : str , displayname : str , * , limited_capi : bool ) -> str | None :
570564 if self .format_unit == 'n' :
571565 return self .format_code ("""
@@ -575,9 +569,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
575569 }}}}
576570 """ ,
577571 argname = argname )
578- if not limited_capi :
579- return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
580- return format_inline_unsigned_int_converter (self , argname )
572+ return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
581573
582574
583575class fildes_converter (CConverter ):
0 commit comments