Skip to content

Commit 3c49182

Browse files
author
martin.v.loewis
committed
Support %zd in PyErr_Format and PyString_FromFormat.
git-svn-id: http://svn.python.org/projects/python/trunk@42401 6015fed2-1504-0410-9fe1-9d1591cc4771
1 parent 247a0ab commit 3c49182

8 files changed

Lines changed: 35 additions & 19 deletions

File tree

Objects/bufferobject.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -243,14 +243,14 @@ buffer_repr(PyBufferObject *self)
243243
const char *status = self->b_readonly ? "read-only" : "read-write";
244244

245245
if ( self->b_base == NULL )
246-
return PyString_FromFormat("<%s buffer ptr %p, size %ld at %p>",
246+
return PyString_FromFormat("<%s buffer ptr %p, size %zd at %p>",
247247
status,
248248
self->b_ptr,
249249
(long)self->b_size,
250250
self);
251251
else
252252
return PyString_FromFormat(
253-
"<%s buffer for %p, size %ld, offset %ld at %p>",
253+
"<%s buffer for %p, size %zd, offset %zd at %p>",
254254
status,
255255
self->b_base,
256256
(long)self->b_size,

Objects/dictobject.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1148,7 +1148,7 @@ PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
11481148
if (n != 2) {
11491149
PyErr_Format(PyExc_ValueError,
11501150
"dictionary update sequence element #%d "
1151-
"has length %ld; 2 is required",
1151+
"has length %zd; 2 is required",
11521152
i, (long)n);
11531153
goto Fail;
11541154
}

Objects/funcobject.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -248,8 +248,8 @@ func_set_code(PyFunctionObject *op, PyObject *value)
248248
PyTuple_GET_SIZE(op->func_closure));
249249
if (nclosure != nfree) {
250250
PyErr_Format(PyExc_ValueError,
251-
"%s() requires a code object with %ld free vars,"
252-
" not %ld",
251+
"%s() requires a code object with %zd free vars,"
252+
" not %zd",
253253
PyString_AsString(op->func_name),
254254
(long)nclosure, (long)nfree);
255255
return -1;
@@ -401,7 +401,7 @@ func_new(PyTypeObject* type, PyObject* args, PyObject* kw)
401401
nclosure = closure == Py_None ? 0 : PyTuple_GET_SIZE(closure);
402402
if (nfree != nclosure)
403403
return PyErr_Format(PyExc_ValueError,
404-
"%s requires closure of length %ld, not %ld",
404+
"%s requires closure of length %zd, not %zd",
405405
PyString_AS_STRING(code->co_name),
406406
(long)nfree, (long)nclosure);
407407
if (nclosure) {

Objects/listobject.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2598,9 +2598,8 @@ list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
25982598
}
25992599

26002600
if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
2601-
/* XXX can we use %zd here? */
26022601
PyErr_Format(PyExc_ValueError,
2603-
"attempt to assign sequence of size %ld to extended slice of size %ld",
2602+
"attempt to assign sequence of size %zd to extended slice of size %zd",
26042603
(long)PySequence_Fast_GET_SIZE(seq),
26052604
(long)slicelength);
26062605
Py_DECREF(seq);

Objects/stringobject.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,9 @@ PyString_FromFormatV(const char *format, va_list vargs)
181181
added */
182182
if (*f == 'l' && *(f+1) == 'd')
183183
++f;
184+
/* likewise for %zd */
185+
if (*f == 'z' && *(f+1) == 'd')
186+
++f;
184187

185188
switch (*f) {
186189
case 'c':
@@ -237,6 +240,7 @@ PyString_FromFormatV(const char *format, va_list vargs)
237240
const char* p = f++;
238241
Py_ssize_t i;
239242
int longflag = 0;
243+
int size_tflag = 0;
240244
/* parse the width.precision part (we're only
241245
interested in the precision value, if any) */
242246
n = 0;
@@ -256,6 +260,11 @@ PyString_FromFormatV(const char *format, va_list vargs)
256260
longflag = 1;
257261
++f;
258262
}
263+
/* handle the size_t flag. */
264+
if (*f == 'z' && *(f+1) == 'd') {
265+
size_tflag = 1;
266+
++f;
267+
}
259268

260269
switch (*f) {
261270
case 'c':
@@ -264,6 +273,18 @@ PyString_FromFormatV(const char *format, va_list vargs)
264273
case 'd':
265274
if (longflag)
266275
sprintf(s, "%ld", va_arg(vargs, long));
276+
else if (size_tflag) {
277+
/* Instead of checking whether the C
278+
library supports %zd, handle the
279+
common cases. */
280+
#if SIZEOF_SIZE_T == SIZEOF_LONG
281+
sprintf(s, "%ld", va_arg(vargs, long));
282+
#elif defined(MS_WINDOWS)
283+
sprintf(s, "%Id", va_arg(vargs, size_t));
284+
#else
285+
#error Cannot print size_t values
286+
#endif
287+
}
267288
else
268289
sprintf(s, "%d", va_arg(vargs, int));
269290
s += strlen(s);

Objects/structseq.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,15 +125,15 @@ structseq_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
125125
if (min_len != max_len) {
126126
if (len < min_len) {
127127
PyErr_Format(PyExc_TypeError,
128-
"%.500s() takes an at least %ld-sequence (%ld-sequence given)",
128+
"%.500s() takes an at least %zd-sequence (%zd-sequence given)",
129129
type->tp_name, (long)min_len, (long)len);
130130
Py_DECREF(arg);
131131
return NULL;
132132
}
133133

134134
if (len > max_len) {
135135
PyErr_Format(PyExc_TypeError,
136-
"%.500s() takes an at most %ld-sequence (%ld-sequence given)",
136+
"%.500s() takes an at most %zd-sequence (%zd-sequence given)",
137137
type->tp_name, (long)max_len, (long)len);
138138
Py_DECREF(arg);
139139
return NULL;
@@ -142,7 +142,7 @@ structseq_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
142142
else {
143143
if (len != min_len) {
144144
PyErr_Format(PyExc_TypeError,
145-
"%.500s() takes a %ld-sequence (%ld-sequence given)",
145+
"%.500s() takes a %zd-sequence (%zd-sequence given)",
146146
type->tp_name, (long)min_len, (long)len);
147147
Py_DECREF(arg);
148148
return NULL;

Objects/typeobject.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3372,10 +3372,9 @@ check_num_args(PyObject *ob, int n)
33723372
}
33733373
if (n == PyTuple_GET_SIZE(ob))
33743374
return 1;
3375-
/* XXX %zd? */
33763375
PyErr_Format(
33773376
PyExc_TypeError,
3378-
"expected %d arguments, got %d", n, (int)PyTuple_GET_SIZE(ob));
3377+
"expected %d arguments, got %zd", n, PyTuple_GET_SIZE(ob));
33793378
return 0;
33803379
}
33813380

Objects/unicodeobject.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -791,8 +791,7 @@ int unicode_decode_call_errorhandler(const char *errors, PyObject **errorHandler
791791
if (newpos<0)
792792
newpos = insize+newpos;
793793
if (newpos<0 || newpos>insize) {
794-
/* XXX %zd? */
795-
PyErr_Format(PyExc_IndexError, "position %d from error handler out of bounds", (int)newpos);
794+
PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", newpos);
796795
goto onError;
797796
}
798797

@@ -2473,8 +2472,7 @@ static PyObject *unicode_encode_call_errorhandler(const char *errors,
24732472
if (*newpos<0)
24742473
*newpos = size+*newpos;
24752474
if (*newpos<0 || *newpos>size) {
2476-
/* XXX %zd? */
2477-
PyErr_Format(PyExc_IndexError, "position %d from error handler out of bounds", (int)*newpos);
2475+
PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", *newpos);
24782476
Py_DECREF(restuple);
24792477
return NULL;
24802478
}
@@ -3373,8 +3371,7 @@ static PyObject *unicode_translate_call_errorhandler(const char *errors,
33733371
else
33743372
*newpos = i_newpos;
33753373
if (*newpos<0 || *newpos>size) {
3376-
/* XXX %zd? */
3377-
PyErr_Format(PyExc_IndexError, "position %d from error handler out of bounds", (int)*newpos);
3374+
PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", *newpos);
33783375
Py_DECREF(restuple);
33793376
return NULL;
33803377
}

0 commit comments

Comments
 (0)