]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
after discussions with perky, reverted fix for Bug #1379994: Builtin
authorAnthony Baxter <anthonybaxter@gmail.com>
Tue, 28 Mar 2006 07:32:36 +0000 (07:32 +0000)
committerAnthony Baxter <anthonybaxter@gmail.com>
Tue, 28 Mar 2006 07:32:36 +0000 (07:32 +0000)
unicode_escape and raw_unicode_escape codec now encodes backslash correctly.

This caused another issue for unicode repr strings being double-escaped
(SF Bug #1459029). Correct fix will be in 2.5, but is too risky for 2.4.3.

Added a testcase for #1459029.

Lib/test/test_unicode.py
Misc/NEWS
Objects/unicodeobject.c

index 7f6a1523c43b9465a8c8d8e2f9fe46ffd78dc886..f70da9d0ab8c8e17aac85abd7b420df5cbce14f0 100644 (file)
@@ -626,24 +626,20 @@ class UnicodeTest(
         self.assertEqual(u'hello'.encode('latin-1'), 'hello')
 
         # Roundtrip safety for BMP (just the first 1024 chars)
-        for c in xrange(1024):
-            u = unichr(c)
-            for encoding in ('utf-7', 'utf-8', 'utf-16', 'utf-16-le',
-                             'utf-16-be', 'raw_unicode_escape',
-                             'unicode_escape', 'unicode_internal'):
-                self.assertEqual(unicode(u.encode(encoding),encoding), u)
+        u = u''.join(map(unichr, xrange(1024)))
+        for encoding in ('utf-7', 'utf-8', 'utf-16', 'utf-16-le', 'utf-16-be',
+                         'raw_unicode_escape', 'unicode_escape', 'unicode_internal'):
+            self.assertEqual(unicode(u.encode(encoding),encoding), u)
 
         # Roundtrip safety for BMP (just the first 256 chars)
-        for c in xrange(256):
-            u = unichr(c)
-            for encoding in ('latin-1',):
-                self.assertEqual(unicode(u.encode(encoding),encoding), u)
+        u = u''.join(map(unichr, xrange(256)))
+        for encoding in ('latin-1',):
+            self.assertEqual(unicode(u.encode(encoding),encoding), u)
 
         # Roundtrip safety for BMP (just the first 128 chars)
-        for c in xrange(128):
-            u = unichr(c)
-            for encoding in ('ascii',):
-                self.assertEqual(unicode(u.encode(encoding),encoding), u)
+        u = u''.join(map(unichr, xrange(128)))
+        for encoding in ('ascii',):
+            self.assertEqual(unicode(u.encode(encoding),encoding), u)
 
         # Roundtrip safety for non-BMP (just a few chars)
         u = u'\U00010001\U00020002\U00030003\U00040004\U00050005'
@@ -744,6 +740,18 @@ class UnicodeTest(
         y = x.encode("raw-unicode-escape").decode("raw-unicode-escape")
         self.assertEqual(x, y)
 
+    def test_unicode_repr(self):
+        class s1:
+            def __repr__(self):
+                return '\\n'
+
+        class s2:
+            def __repr__(self):
+                return u'\\n'
+
+        self.assertEqual(repr(s1()), '\\n')
+        self.assertEqual(repr(s2()), '\\n')
+
 def test_main():
     test_support.run_unittest(UnicodeTest)
 
index fe3884d04e0627916d479657178bf5d6f8deb859..aa41dd71aa8e6280816a025502f9c3baf0cc4d66 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -17,6 +17,10 @@ Core and builtins
 - A threading issue that caused random segfaults on some platforms from 
   the testsuite was fixed in test_capi.
 
+- Reverted fix for Bug #1379994: Builtin unicode_escape and 
+  raw_unicode_escape codec now encodes backslash correctly.
+  This caused another issue for unicode repr strings being double-escaped
+  (SF Bug #1459029). Correct fix will be in 2.5, but is too risky for 2.4.3.
 
 What's New in Python 2.4.3c1?
 =============================
index 690f016c9e53347a1d986f240647f773f1fb3314..fc503c7badd56fe5e192a98d17e68dc95f68a924 100644 (file)
@@ -1982,9 +1982,9 @@ PyObject *unicodeescape_string(const Py_UNICODE *s,
     while (size-- > 0) {
         Py_UNICODE ch = *s++;
 
-        /* Escape quotes and backslashes */
-        if ((quotes &&
-            ch == (Py_UNICODE) PyString_AS_STRING(repr)[1]) || ch == '\\') {
+        /* Escape quotes */
+        if (quotes &&
+           (ch == (Py_UNICODE) PyString_AS_STRING(repr)[1] || ch == '\\')) {
             *p++ = '\\';
             *p++ = (char) ch;
            continue;