[Python-checkins] r66377 - in python/trunk: Misc/NEWS Modules/_collectionsmodule.c Modules/_multiprocessing/connection.h Modules/_multiprocessing/multiprocessing.h Python/Python-ast.c

amaury.forgeotdarc python-checkins at python.org
Thu Sep 11 00:04:46 CEST 2008


Author: amaury.forgeotdarc
Date: Thu Sep 11 00:04:45 2008
New Revision: 66377

Log:
#3743: PY_FORMAT_SIZE_T is designed for the OS "printf" functions, not for 
PyString_FromFormat which has an independent implementation, and uses "%zd".

This makes a difference on win64, where printf needs "%Id" to display
64bit values. For example, queue.__repr__ was incorrect.

Reviewed by Martin von Loewis.


Modified:
   python/trunk/Misc/NEWS
   python/trunk/Modules/_collectionsmodule.c
   python/trunk/Modules/_multiprocessing/connection.h
   python/trunk/Modules/_multiprocessing/multiprocessing.h
   python/trunk/Python/Python-ast.c

Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Thu Sep 11 00:04:45 2008
@@ -12,6 +12,14 @@
 Core and Builtins
 -----------------
 
+- Issue #3743: In a few places, PY_FORMAT_SIZE_T was incorrectly used with
+  PyString_FromFormat or PyErr_Format to display size_t values. The macro
+  PY_FORMAT_SIZE_T is designed to select the correct format for the OS
+  ``printf`` function, whereas PyString_FromFormat has an independent
+  implementation and uses "%zd" on all platforms for size_t values.
+  This makes a difference on win64, where ``printf`` needs "%Id" to display
+  64bit values.
+
 - Issue #3634: _weakref.ref(Exception).__init__() gave invalid return value on
   error.
 

Modified: python/trunk/Modules/_collectionsmodule.c
==============================================================================
--- python/trunk/Modules/_collectionsmodule.c	(original)
+++ python/trunk/Modules/_collectionsmodule.c	Thu Sep 11 00:04:45 2008
@@ -670,7 +670,7 @@
 		return NULL;
 	}
 	if (((dequeobject *)deque)->maxlen != -1)
-		fmt = PyString_FromFormat("deque(%%r, maxlen=%" PY_FORMAT_SIZE_T "d)", 
+		fmt = PyString_FromFormat("deque(%%r, maxlen=%zd)", 
 					((dequeobject *)deque)->maxlen);
 	else
 		fmt = PyString_FromString("deque(%r)");  

Modified: python/trunk/Modules/_multiprocessing/connection.h
==============================================================================
--- python/trunk/Modules/_multiprocessing/connection.h	(original)
+++ python/trunk/Modules/_multiprocessing/connection.h	Thu Sep 11 00:04:45 2008
@@ -47,8 +47,8 @@
 		return NULL;
 
 	if (handle == INVALID_HANDLE_VALUE || (Py_ssize_t)handle < 0) {
-		PyErr_Format(PyExc_IOError, "invalid handle %" 
-			     PY_FORMAT_SIZE_T "d", (Py_ssize_t)handle);
+		PyErr_Format(PyExc_IOError, "invalid handle %zd",
+			     (Py_ssize_t)handle);
 		return NULL;
 	}
 
@@ -396,7 +396,7 @@
 	static char *conn_type[] = {"read-only", "write-only", "read-write"};
 
 	assert(self->flags >= 1 && self->flags <= 3);
-	return FROM_FORMAT("<%s %s, handle %" PY_FORMAT_SIZE_T "d>", 
+	return FROM_FORMAT("<%s %s, handle %zd>", 
 			   conn_type[self->flags - 1],
 			   CONNECTION_NAME, (Py_ssize_t)self->handle);
 }

Modified: python/trunk/Modules/_multiprocessing/multiprocessing.h
==============================================================================
--- python/trunk/Modules/_multiprocessing/multiprocessing.h	(original)
+++ python/trunk/Modules/_multiprocessing/multiprocessing.h	Thu Sep 11 00:04:45 2008
@@ -56,7 +56,6 @@
 #  define PY_SSIZE_T_MAX INT_MAX
 #  define PY_SSIZE_T_MIN INT_MIN
 #  define F_PY_SSIZE_T "i"
-#  define PY_FORMAT_SIZE_T ""
 #  define PyInt_FromSsize_t(n) PyInt_FromLong((long)n)
 #else
 #  define F_PY_SSIZE_T "n"

Modified: python/trunk/Python/Python-ast.c
==============================================================================
--- python/trunk/Python/Python-ast.c	(original)
+++ python/trunk/Python/Python-ast.c	Thu Sep 11 00:04:45 2008
@@ -387,7 +387,7 @@
     if (PyTuple_GET_SIZE(args) > 0) {
         if (numfields != PyTuple_GET_SIZE(args)) {
             PyErr_Format(PyExc_TypeError, "%.400s constructor takes %s"
-                         "%" PY_FORMAT_SIZE_T "d positional argument%s",
+                         "%zd positional argument%s",
                          Py_TYPE(self)->tp_name,
                          numfields == 0 ? "" : "either 0 or ",
                          numfields, numfields == 1 ? "" : "s");


More information about the Python-checkins mailing list