diff --git a/Doc/api/utilities.tex b/Doc/api/utilities.tex index 12216f29d8a..78526b83d4d 100644 --- a/Doc/api/utilities.tex +++ b/Doc/api/utilities.tex @@ -836,14 +836,36 @@ PyArg_ParseTuple(args, "O|O:ref", &object, &callback) Convert a plain C \ctype{int} to a Python integer object. \item[\samp{b} (integer) {[char]}] - Same as \samp{i}. + Convert a plain C \ctype{char} to a Python integer object. \item[\samp{h} (integer) {[short int]}] - Same as \samp{i}. + Convert a plain C \ctype{short int} to a Python integer object. \item[\samp{l} (integer) {[long int]}] Convert a C \ctype{long int} to a Python integer object. + \item[\samp{B} (integer) {[unsigned char]}] + Convert a C \ctype{unsigned char} to a Python integer object. + + \item[\samp{H} (integer) {[unsigned short int]}] + Convert a C \ctype{unsigned short int} to a Python integer object. + + \item[\samp{I} (integer/long) {[unsigned int]}] + Convert a C \ctype{unsigned int} to a Python integer object + or a Python long integer object, if it is larger than \code{sys.maxint}. + + \item[\samp{k} (integer/long) {[unsigned long]}] + Convert a C \ctype{unsigned long} to a Python integer object + or a Python long integer object, if it is larger than \code{sys.maxint}. + + \item[\samp{L} (long) {[PY_LONG_LONG]}] + Convert a C \ctype{long long} to a Python long integer object. Only + available on platforms that support \ctype{long long}. + + \item[\samp{K} (long) {[unsigned PY_LONG_LONG]}] + Convert a C \ctype{unsigned long long} to a Python long integer object. + Only available on platforms that support \ctype{unsigned long long}. + \item[\samp{c} (string of length 1) {[char]}] Convert a C \ctype{int} representing a character to a Python string of length 1. diff --git a/Misc/NEWS b/Misc/NEWS index 73171f3031b..de637e1f9f2 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ What's New in Python 2.5 alpha 1? Core and builtins ----------------- +- Bug #1281408: Py_BuildValue now works correct even with unsigned longs + and long longs. + - SF Bug #1350188, "setdlopenflags" leads to crash upon "import" It was possible dlerror() returns a NULL pointer, use a default error message in this case. diff --git a/Python/modsupport.c b/Python/modsupport.c index fbfb48dc265..3b4c517e4ce 100644 --- a/Python/modsupport.c +++ b/Python/modsupport.c @@ -303,18 +303,35 @@ do_mkvalue(char **p_format, va_list *p_va) case 'H': return PyInt_FromLong((long)va_arg(*p_va, unsigned int)); + case 'I': + { + unsigned int n; + n = va_arg(*p_va, unsigned int); + if (n > PyInt_GetMax()) + return PyLong_FromUnsignedLong((unsigned long)n); + else + return PyInt_FromLong(n); + } + case 'l': - return PyInt_FromLong((long)va_arg(*p_va, long)); + return PyInt_FromLong(va_arg(*p_va, long)); case 'k': - return PyInt_FromLong((long)va_arg(*p_va, unsigned long)); + { + unsigned long n; + n = va_arg(*p_va, unsigned long); + if (n > PyInt_GetMax()) + return PyLong_FromUnsignedLong(n); + else + return PyInt_FromLong(n); + } #ifdef HAVE_LONG_LONG case 'L': return PyLong_FromLongLong((PY_LONG_LONG)va_arg(*p_va, PY_LONG_LONG)); case 'K': - return PyLong_FromLongLong((PY_LONG_LONG)va_arg(*p_va, unsigned PY_LONG_LONG)); + return PyLong_FromUnsignedLongLong((PY_LONG_LONG)va_arg(*p_va, unsigned PY_LONG_LONG)); #endif #ifdef Py_USING_UNICODE case 'u':