]> granicus.if.org Git - python/commitdiff
bug #1281408: make Py_BuildValue work with unsigned longs and long longs
authorGeorg Brandl <georg@python.org>
Thu, 24 Nov 2005 15:37:42 +0000 (15:37 +0000)
committerGeorg Brandl <georg@python.org>
Thu, 24 Nov 2005 15:37:42 +0000 (15:37 +0000)
Doc/api/utilities.tex
Misc/NEWS
Python/modsupport.c

index 12216f29d8ab1e217fa092aa32ce81fe08f381a5..78526b83d4da730ab495759b747671bc9fb2faa3 100644 (file)
@@ -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.
index 73171f3031be718bf46ee474b11d958e5c52e18f..de637e1f9f20b6ca8fe4c0e1bf94064b5ddbbe91 100644 (file)
--- 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.
index fbfb48dc265df7f13780e953f51d85b92f2b60b3..3b4c517e4ceb07e0458cf2e7a13e200427db5b1a 100644 (file)
@@ -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':