bug #1281408: make Py_BuildValue work with unsigned longs and long longs
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 @@
 		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':