]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
When expandtabs() would be a no-op, don't create a duplicate string
authorAntoine Pitrou <solipsis@pitrou.net>
Tue, 4 Oct 2011 14:04:01 +0000 (16:04 +0200)
committerAntoine Pitrou <solipsis@pitrou.net>
Tue, 4 Oct 2011 14:04:01 +0000 (16:04 +0200)
Lib/test/test_unicode.py
Objects/unicodeobject.c

index 4f6f132e25614983ab33da0bb0a4cd4dd31e9bcc..840b76f20efa31cefe559b87e76c2784f5ca7bff 100644 (file)
@@ -1585,6 +1585,10 @@ class UnicodeTest(string_tests.CommonTest,
             return
         self.assertRaises(OverflowError, 't\tt\t'.expandtabs, sys.maxsize)
 
+    def test_expandtabs_optimization(self):
+        s = 'abc'
+        self.assertIs(s.expandtabs(), s)
+
     def test_raiseMemError(self):
         if struct.calcsize('P') == 8:
             # 64 bits pointers
index f3a5dd9b578c562c4b0409fba2674bd3df9bd960..af4ce6383c4d028a041d35ba193ff5cc6b6d3423 100644 (file)
@@ -10196,6 +10196,7 @@ unicode_expandtabs(PyUnicodeObject *self, PyObject *args)
     void *src_data, *dest_data;
     int tabsize = 8;
     int kind;
+    int found;
 
     if (!PyArg_ParseTuple(args, "|i:expandtabs", &tabsize))
         return NULL;
@@ -10205,9 +10206,11 @@ unicode_expandtabs(PyUnicodeObject *self, PyObject *args)
     i = j = line_pos = 0;
     kind = PyUnicode_KIND(self);
     src_data = PyUnicode_DATA(self);
+    found = 0;
     for (; i < src_len; i++) {
         ch = PyUnicode_READ(kind, src_data, i);
         if (ch == '\t') {
+            found = 1;
             if (tabsize > 0) {
                 incr = tabsize - (line_pos % tabsize); /* cannot overflow */
                 if (j > PY_SSIZE_T_MAX - incr)
@@ -10225,6 +10228,10 @@ unicode_expandtabs(PyUnicodeObject *self, PyObject *args)
                 line_pos = 0;
         }
     }
+    if (!found && PyUnicode_CheckExact(self)) {
+        Py_INCREF((PyObject *) self);
+        return (PyObject *) self;
+    }
 
     /* Second pass: create output string and fill it */
     u = PyUnicode_New(j, PyUnicode_MAX_CHAR_VALUE(self));