sees a Unicode argument. Unfortunately this test was also executed
for %r, because %s and %r share almost all of their code. This meant
that, if u is a unicode object while repr(u) is an 8-bit string
containing ASCII characters, '%r' % u is a *unicode* string containing
only ASCII characters!
Fixed by executing the test only for %s.
Also fixed an error message -- %s argument has non-string str()
doesn't make sense for %r, so the error message now differentiates
between %s and %r.
len = 1;
break;
case 's':
- case 'r':
#ifdef Py_USING_UNICODE
if (PyUnicode_Check(v)) {
fmt = fmt_start;
goto unicode;
}
#endif
+ /* Fall through */
+ case 'r':
if (c == 's')
temp = PyObject_Str(v);
else
goto error;
if (!PyString_Check(temp)) {
PyErr_SetString(PyExc_TypeError,
- "%s argument has non-string str()");
+ c == 's' ?
+ "%s argument has non-string str()" :
+ "%r argument has non-string repr()");
Py_DECREF(temp);
goto error;
}