summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorg Brandl <georg@python.org>2005-11-24 15:37:42 (GMT)
committerGeorg Brandl <georg@python.org>2005-11-24 15:37:42 (GMT)
commitf06e30af4a0b556d2144b6fd473afeddbc21bb2f (patch)
tree2edf45d64c13319d09d09f22eca6200c1d1e2279
parent9df23ea1fc7cc9325b03c9a4beb7f4852687378f (diff)
downloadcpython-f06e30af4a0b556d2144b6fd473afeddbc21bb2f.zip
cpython-f06e30af4a0b556d2144b6fd473afeddbc21bb2f.tar.gz
cpython-f06e30af4a0b556d2144b6fd473afeddbc21bb2f.tar.bz2
bug #1281408: make Py_BuildValue work with unsigned longs and long longs
-rw-r--r--Doc/api/utilities.tex26
-rw-r--r--Misc/NEWS3
-rw-r--r--Python/modsupport.c23
3 files changed, 47 insertions, 5 deletions
diff --git a/Doc/api/utilities.tex b/Doc/api/utilities.tex
index 12216f2..78526b8 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 73171f3..de637e1 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 fbfb48d..3b4c517 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':