[Python-checkins] r58179 - in python/branches/release25-maint: Lib/test/test_re.py Modules/_sre.c

sean.reifschneider python-checkins at python.org
Mon Sep 17 11:43:12 CEST 2007


Author: sean.reifschneider
Date: Mon Sep 17 11:43:11 2007
New Revision: 58179

Modified:
   python/branches/release25-maint/Lib/test/test_re.py
   python/branches/release25-maint/Modules/_sre.c
Log:
issue1140: Guido's patch from revision 58098 (2.6) applied to 2.5.


Modified: python/branches/release25-maint/Lib/test/test_re.py
==============================================================================
--- python/branches/release25-maint/Lib/test/test_re.py	(original)
+++ python/branches/release25-maint/Lib/test/test_re.py	Mon Sep 17 11:43:11 2007
@@ -83,6 +83,31 @@
         self.assertEqual(re.sub('\r\n', '\n', 'abc\r\ndef\r\n'),
                          'abc\ndef\n')
 
+    def test_bug_1140(self):
+        # re.sub(x, y, u'') should return u'', not '', and
+        # re.sub(x, y, '') should return '', not u''.
+        # Also:
+        # re.sub(x, y, unicode(x)) should return unicode(y), and
+        # re.sub(x, y, str(x)) should return
+        #     str(y) if isinstance(y, str) else unicode(y).
+        for x in 'x', u'x':
+            for y in 'y', u'y':
+                z = re.sub(x, y, u'')
+                self.assertEqual(z, u'')
+                self.assertEqual(type(z), unicode)
+                #
+                z = re.sub(x, y, '')
+                self.assertEqual(z, '')
+                self.assertEqual(type(z), str)
+                #
+                z = re.sub(x, y, unicode(x))
+                self.assertEqual(z, y)
+                self.assertEqual(type(z), unicode)
+                #
+                z = re.sub(x, y, str(x))
+                self.assertEqual(z, y)
+                self.assertEqual(type(z), type(y))
+
     def test_sub_template_numeric_escape(self):
         # bug 776311 and friends
         self.assertEqual(re.sub('x', r'\0', 'x'), '\0')

Modified: python/branches/release25-maint/Modules/_sre.c
==============================================================================
--- python/branches/release25-maint/Modules/_sre.c	(original)
+++ python/branches/release25-maint/Modules/_sre.c	Mon Sep 17 11:43:11 2007
@@ -1979,7 +1979,7 @@
 #endif
 
 static PyObject*
-join_list(PyObject* list, PyObject* pattern)
+join_list(PyObject* list, PyObject* string)
 {
     /* join list elements */
 
@@ -1990,24 +1990,15 @@
 #endif
     PyObject* result;
 
-    switch (PyList_GET_SIZE(list)) {
-    case 0:
-        Py_DECREF(list);
-        return PySequence_GetSlice(pattern, 0, 0);
-    case 1:
-        result = PyList_GET_ITEM(list, 0);
-        Py_INCREF(result);
-        Py_DECREF(list);
-        return result;
-    }
-
-    /* two or more elements: slice out a suitable separator from the
-       first member, and use that to join the entire list */
-
-    joiner = PySequence_GetSlice(pattern, 0, 0);
+    joiner = PySequence_GetSlice(string, 0, 0);
     if (!joiner)
         return NULL;
 
+    if (PyList_GET_SIZE(list) == 0) {
+        Py_DECREF(list);
+        return joiner;
+    }
+
 #if PY_VERSION_HEX >= 0x01060000
     function = PyObject_GetAttrString(joiner, "join");
     if (!function) {
@@ -2443,7 +2434,7 @@
     Py_DECREF(filter);
 
     /* convert list to single string (also removes list) */
-    item = join_list(list, self->pattern);
+    item = join_list(list, string);
 
     if (!item)
         return NULL;


More information about the Python-checkins mailing list