From b00c07f038b3fdc567eaf7ae3d6f5006dd66a5dd Mon Sep 17 00:00:00 2001
From: Guido van Rossum <guido@python.org>
Date: Wed, 9 Oct 2002 19:07:53 +0000
Subject: The string formatting code has a test to switch to Unicode when %s
 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.
---
 Objects/stringobject.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index 932ef51..52f96ff 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -3858,7 +3858,6 @@ PyString_Format(PyObject *format, PyObject *args)
 				len = 1;
 				break;
 			case 's':
-  			case 'r':
 #ifdef Py_USING_UNICODE
 				if (PyUnicode_Check(v)) {
 					fmt = fmt_start;
@@ -3866,6 +3865,8 @@ PyString_Format(PyObject *format, PyObject *args)
 					goto unicode;
 				}
 #endif
+				/* Fall through */
+  			case 'r':
 				if (c == 's')
 					temp = PyObject_Str(v);
 				else
@@ -3874,7 +3875,9 @@ PyString_Format(PyObject *format, PyObject *args)
 					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;
 				}
-- 
cgit v0.12