@@ -211,6 +211,28 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
211211 return super ().parse_arg (argname , displayname , limited_capi = limited_capi )
212212
213213
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+
214236class unsigned_short_converter (CConverter ):
215237 type = 'unsigned short'
216238 default_type = int
@@ -238,22 +260,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
238260 argname = argname )
239261 if not limited_capi :
240262 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 )
257264
258265
259266@add_legacy_c_converter ('C' , accept = {str })
@@ -331,22 +338,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
331338 argname = argname )
332339 if not limited_capi :
333340 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 )
350342
351343
352344class long_converter (CConverter ):
@@ -397,14 +389,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
397389 )
398390 if not limited_capi :
399391 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 )
408393
409394
410395class long_long_converter (CConverter ):
@@ -455,14 +440,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
455440 )
456441 if not limited_capi :
457442 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 )
466444
467445
468446class Py_ssize_t_converter (CConverter ):
@@ -599,14 +577,7 @@ def parse_arg(self, argname: str, displayname: str, *, limited_capi: bool) -> st
599577 argname = argname )
600578 if not limited_capi :
601579 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 )
610581
611582
612583class fildes_converter (CConverter ):
0 commit comments