From 05e344954de5f4e55eb49dc44b0f8e1ec272a06c Mon Sep 17 00:00:00 2001 From: Amaury Forgeot d'Arc Date: Wed, 10 Sep 2008 22:04:45 +0000 Subject: [PATCH] #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. --- Misc/NEWS | 8 ++++++++ Modules/_collectionsmodule.c | 2 +- Modules/_multiprocessing/connection.h | 6 +++--- Modules/_multiprocessing/multiprocessing.h | 1 - Python/Python-ast.c | 2 +- 5 files changed, 13 insertions(+), 6 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index 4696a805e3d..b9ec0e16492 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,14 @@ What's New in Python 2.6 release candidate 1? 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. diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index d6dcffd4133..da000d0e80b 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -670,7 +670,7 @@ deque_repr(PyObject *deque) 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)"); diff --git a/Modules/_multiprocessing/connection.h b/Modules/_multiprocessing/connection.h index 66a3e8ad86a..155b61b57ca 100644 --- a/Modules/_multiprocessing/connection.h +++ b/Modules/_multiprocessing/connection.h @@ -47,8 +47,8 @@ connection_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 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 @@ connection_repr(ConnectionObject *self) 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); } diff --git a/Modules/_multiprocessing/multiprocessing.h b/Modules/_multiprocessing/multiprocessing.h index ec5042c9d64..0b327905ea3 100644 --- a/Modules/_multiprocessing/multiprocessing.h +++ b/Modules/_multiprocessing/multiprocessing.h @@ -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" diff --git a/Python/Python-ast.c b/Python/Python-ast.c index f958145a233..1c78515bcea 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -387,7 +387,7 @@ ast_type_init(PyObject *self, PyObject *args, PyObject *kw) 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");