Skip to content

Commit 2cf0a51

Browse files
author
reinhold.birkenfeld
committed
bug #1281408: make Py_BuildValue work with unsigned longs and long longs
git-svn-id: http://svn.python.org/projects/python/trunk@41527 6015fed2-1504-0410-9fe1-9d1591cc4771
1 parent b5ada66 commit 2cf0a51

3 files changed

Lines changed: 47 additions & 5 deletions

File tree

Doc/api/utilities.tex

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -836,14 +836,36 @@ \section{Parsing arguments and building values
836836
Convert a plain C \ctype{int} to a Python integer object.
837837

838838
\item[\samp{b} (integer) {[char]}]
839-
Same as \samp{i}.
839+
Convert a plain C \ctype{char} to a Python integer object.
840840

841841
\item[\samp{h} (integer) {[short int]}]
842-
Same as \samp{i}.
842+
Convert a plain C \ctype{short int} to a Python integer object.
843843

844844
\item[\samp{l} (integer) {[long int]}]
845845
Convert a C \ctype{long int} to a Python integer object.
846846

847+
\item[\samp{B} (integer) {[unsigned char]}]
848+
Convert a C \ctype{unsigned char} to a Python integer object.
849+
850+
\item[\samp{H} (integer) {[unsigned short int]}]
851+
Convert a C \ctype{unsigned short int} to a Python integer object.
852+
853+
\item[\samp{I} (integer/long) {[unsigned int]}]
854+
Convert a C \ctype{unsigned int} to a Python integer object
855+
or a Python long integer object, if it is larger than \code{sys.maxint}.
856+
857+
\item[\samp{k} (integer/long) {[unsigned long]}]
858+
Convert a C \ctype{unsigned long} to a Python integer object
859+
or a Python long integer object, if it is larger than \code{sys.maxint}.
860+
861+
\item[\samp{L} (long) {[PY_LONG_LONG]}]
862+
Convert a C \ctype{long long} to a Python long integer object. Only
863+
available on platforms that support \ctype{long long}.
864+
865+
\item[\samp{K} (long) {[unsigned PY_LONG_LONG]}]
866+
Convert a C \ctype{unsigned long long} to a Python long integer object.
867+
Only available on platforms that support \ctype{unsigned long long}.
868+
847869
\item[\samp{c} (string of length 1) {[char]}]
848870
Convert a C \ctype{int} representing a character to a Python
849871
string of length 1.

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ What's New in Python 2.5 alpha 1?
1212
Core and builtins
1313
-----------------
1414

15+
- Bug #1281408: Py_BuildValue now works correct even with unsigned longs
16+
and long longs.
17+
1518
- SF Bug #1350188, "setdlopenflags" leads to crash upon "import"
1619
It was possible dlerror() returns a NULL pointer, use a default error
1720
message in this case.

Python/modsupport.c

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -303,18 +303,35 @@ do_mkvalue(char **p_format, va_list *p_va)
303303
case 'H':
304304
return PyInt_FromLong((long)va_arg(*p_va, unsigned int));
305305

306+
case 'I':
307+
{
308+
unsigned int n;
309+
n = va_arg(*p_va, unsigned int);
310+
if (n > PyInt_GetMax())
311+
return PyLong_FromUnsignedLong((unsigned long)n);
312+
else
313+
return PyInt_FromLong(n);
314+
}
315+
306316
case 'l':
307-
return PyInt_FromLong((long)va_arg(*p_va, long));
317+
return PyInt_FromLong(va_arg(*p_va, long));
308318

309319
case 'k':
310-
return PyInt_FromLong((long)va_arg(*p_va, unsigned long));
320+
{
321+
unsigned long n;
322+
n = va_arg(*p_va, unsigned long);
323+
if (n > PyInt_GetMax())
324+
return PyLong_FromUnsignedLong(n);
325+
else
326+
return PyInt_FromLong(n);
327+
}
311328

312329
#ifdef HAVE_LONG_LONG
313330
case 'L':
314331
return PyLong_FromLongLong((PY_LONG_LONG)va_arg(*p_va, PY_LONG_LONG));
315332

316333
case 'K':
317-
return PyLong_FromLongLong((PY_LONG_LONG)va_arg(*p_va, unsigned PY_LONG_LONG));
334+
return PyLong_FromUnsignedLongLong((PY_LONG_LONG)va_arg(*p_va, unsigned PY_LONG_LONG));
318335
#endif
319336
#ifdef Py_USING_UNICODE
320337
case 'u':

0 commit comments

Comments
 (0)