@@ -211,6 +211,28 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
211
211
return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
212
212
213
213
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
+
214
236
class unsigned_short_converter (CConverter ):
215
237
type = 'unsigned short'
216
238
default_type = int
@@ -238,22 +260,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
238
260
argname = argname )
239
261
if not limited_capi :
240
262
return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
241
- # NOTE: Raises OverflowError for negative integer.
242
- return self .format_code ("""
243
- {{{{
244
- unsigned long uval = PyLong_AsUnsignedLong({argname});
245
- if (uval == (unsigned long)-1 && PyErr_Occurred()) {{{{
246
- goto exit;
247
- }}}}
248
- if (uval > USHRT_MAX) {{{{
249
- PyErr_SetString(PyExc_OverflowError,
250
- "Python int too large for C unsigned short");
251
- goto exit;
252
- }}}}
253
- {paramname} = (unsigned short) uval;
254
- }}}}
255
- """ ,
256
- argname = argname )
263
+ return format_inline_unsigned_int_converter (self , argname )
257
264
258
265
259
266
@add_legacy_c_converter ('C' , accept = {str })
@@ -331,22 +338,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
331
338
argname = argname )
332
339
if not limited_capi :
333
340
return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
334
- # NOTE: Raises OverflowError for negative integer.
335
- return self .format_code ("""
336
- {{{{
337
- unsigned long uval = PyLong_AsUnsignedLong({argname});
338
- if (uval == (unsigned long)-1 && PyErr_Occurred()) {{{{
339
- goto exit;
340
- }}}}
341
- if (uval > UINT_MAX) {{{{
342
- PyErr_SetString(PyExc_OverflowError,
343
- "Python int too large for C unsigned int");
344
- goto exit;
345
- }}}}
346
- {paramname} = (unsigned int) uval;
347
- }}}}
348
- """ ,
349
- argname = argname )
341
+ return format_inline_unsigned_int_converter (self , argname )
350
342
351
343
352
344
class long_converter (CConverter ):
@@ -397,14 +389,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
397
389
)
398
390
if not limited_capi :
399
391
return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
400
- # NOTE: Raises OverflowError for negative integer.
401
- return self .format_code ("""
402
- {paramname} = PyLong_AsUnsignedLong({argname});
403
- if ({paramname} == (unsigned long)-1 && PyErr_Occurred()) {{{{
404
- goto exit;
405
- }}}}
406
- """ ,
407
- argname = argname )
392
+ return format_inline_unsigned_int_converter (self , argname )
408
393
409
394
410
395
class long_long_converter (CConverter ):
@@ -455,14 +440,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
455
440
)
456
441
if not limited_capi :
457
442
return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
458
- # NOTE: Raises OverflowError for negative integer.
459
- return self .format_code ("""
460
- {paramname} = PyLong_AsUnsignedLongLong({argname});
461
- if ({paramname} == (unsigned long long)-1 && PyErr_Occurred()) {{{{
462
- goto exit;
463
- }}}}
464
- """ ,
465
- argname = argname )
443
+ return format_inline_unsigned_int_converter (self , argname )
466
444
467
445
468
446
class Py_ssize_t_converter (CConverter ):
@@ -599,14 +577,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
599
577
argname = argname )
600
578
if not limited_capi :
601
579
return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
602
- # NOTE: Raises OverflowError for negative integer.
603
- return self .format_code ("""
604
- {paramname} = PyLong_AsSize_t({argname});
605
- if ({paramname} == (size_t)-1 && PyErr_Occurred()) {{{{
606
- goto exit;
607
- }}}}
608
- """ ,
609
- argname = argname )
580
+ return format_inline_unsigned_int_converter (self , argname )
610
581
611
582
612
583
class fildes_converter (CConverter ):
0 commit comments