17
17
TypeSet = set [bltns .type [object ]]
18
18
19
19
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
+
20
68
class bool_converter (CConverter ):
21
69
type = 'int'
22
70
default_type = bool
@@ -211,29 +259,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
211
259
return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
212
260
213
261
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 ):
237
263
type = 'unsigned short'
238
264
default_type = int
239
265
c_ignored_default = "0"
@@ -244,11 +270,6 @@ def converter_init(self, *, bitwise: bool = False) -> None:
244
270
else :
245
271
self .converter = '_PyLong_UnsignedShort_Converter'
246
272
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
-
252
273
def parse_arg (self , argname : str , displayname : str , * , limited_capi : bool ) -> str | None :
253
274
if self .format_unit == 'H' :
254
275
return self .format_code ("""
@@ -258,9 +279,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
258
279
}}}}
259
280
""" ,
260
281
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 )
264
283
265
284
266
285
@add_legacy_c_converter ('C' , accept = {str })
@@ -311,7 +330,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
311
330
return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
312
331
313
332
314
- class unsigned_int_converter (CConverter ):
333
+ class unsigned_int_converter (BaseUnsignedIntConverter ):
315
334
type = 'unsigned int'
316
335
default_type = int
317
336
c_ignored_default = "0"
@@ -322,11 +341,6 @@ def converter_init(self, *, bitwise: bool = False) -> None:
322
341
else :
323
342
self .converter = '_PyLong_UnsignedInt_Converter'
324
343
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
-
330
344
def parse_arg (self , argname : str , displayname : str , * , limited_capi : bool ) -> str | None :
331
345
if self .format_unit == 'I' :
332
346
return self .format_code ("""
@@ -336,9 +350,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
336
350
}}}}
337
351
""" ,
338
352
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 )
342
354
343
355
344
356
class long_converter (CConverter ):
@@ -359,7 +371,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
359
371
return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
360
372
361
373
362
- class unsigned_long_converter (CConverter ):
374
+ class unsigned_long_converter (BaseUnsignedIntConverter ):
363
375
type = 'unsigned long'
364
376
default_type = int
365
377
c_ignored_default = "0"
@@ -370,11 +382,6 @@ def converter_init(self, *, bitwise: bool = False) -> None:
370
382
else :
371
383
self .converter = '_PyLong_UnsignedLong_Converter'
372
384
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
-
378
385
def parse_arg (self , argname : str , displayname : str , * , limited_capi : bool ) -> str | None :
379
386
if self .format_unit == 'k' :
380
387
return self .format_code ("""
@@ -387,9 +394,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
387
394
argname = argname ,
388
395
bad_argument = self .bad_argument (displayname , 'int' , limited_capi = limited_capi ),
389
396
)
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 )
393
398
394
399
395
400
class long_long_converter (CConverter ):
@@ -410,7 +415,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
410
415
return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
411
416
412
417
413
- class unsigned_long_long_converter (CConverter ):
418
+ class unsigned_long_long_converter (BaseUnsignedIntConverter ):
414
419
type = 'unsigned long long'
415
420
default_type = int
416
421
c_ignored_default = "0"
@@ -421,11 +426,6 @@ def converter_init(self, *, bitwise: bool = False) -> None:
421
426
else :
422
427
self .converter = '_PyLong_UnsignedLongLong_Converter'
423
428
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
-
429
429
def parse_arg (self , argname : str , displayname : str , * , limited_capi : bool ) -> str | None :
430
430
if self .format_unit == 'K' :
431
431
return self .format_code ("""
@@ -438,9 +438,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
438
438
argname = argname ,
439
439
bad_argument = self .bad_argument (displayname , 'int' , limited_capi = limited_capi ),
440
440
)
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 )
444
442
445
443
446
444
class Py_ssize_t_converter (CConverter ):
@@ -557,15 +555,11 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
557
555
argname = argname )
558
556
559
557
560
- class size_t_converter (CConverter ):
558
+ class size_t_converter (BaseUnsignedIntConverter ):
561
559
type = 'size_t'
562
560
converter = '_PyLong_Size_t_Converter'
563
561
c_ignored_default = "0"
564
562
565
- def use_converter (self ) -> None :
566
- self .add_include ('pycore_long.h' ,
567
- '_PyLong_Size_t_Converter()' )
568
-
569
563
def parse_arg (self , argname : str , displayname : str , * , limited_capi : bool ) -> str | None :
570
564
if self .format_unit == 'n' :
571
565
return self .format_code ("""
@@ -575,9 +569,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
575
569
}}}}
576
570
""" ,
577
571
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 )
581
573
582
574
583
575
class fildes_converter (CConverter ):
0 commit comments