Index: Lib/test/test_string.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_string.py,v retrieving revision 1.25 diff -c -r1.25 test_string.py *** Lib/test/test_string.py 1 May 2003 17:45:50 -0000 1.25 --- Lib/test/test_string.py 11 Aug 2004 22:37:56 -0000 *************** *** 52,57 **** --- 52,80 ---- self.checkraises(TypeError, string_tests.BadSeq1(), 'join', ' ') self.checkequal('a b c', string_tests.BadSeq2(), 'join', ' ') + def test_bug1001011(self): + # Make sure join returns a NEW object for single item sequences + # involving a subclass + # Make sure that it is of the appropriate type + # Check the optimisation still occurs for standard objects + class str_subclass(str): pass + s1 = str_subclass('abcd') + s2 = ''.join([s1]) + self.failIf(s1 is s2) + self.assertEqual(type(s2), type('')) + s3 = 'abcd' + s4 = ''.join([s3]) + self.failUnless(s3 is s4) + if test_support.have_unicode: + class unicode_subclass(unicode): pass + u1 = unicode_subclass(u'abcd') + u2 = ''.join([u1]) + self.failIf(u1 is u2) + self.assertEqual(type(u2), type(u'')) + u3 = u'abcd' + u4 = ''.join([u3]) + self.failUnless(u3 is u4) + class ModuleTest(unittest.TestCase): def test_attrs(self): Index: Objects/stringobject.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/stringobject.c,v retrieving revision 2.224 diff -c -r2.224 stringobject.c *** Objects/stringobject.c 7 Aug 2004 20:58:32 -0000 2.224 --- Objects/stringobject.c 11 Aug 2004 22:32:24 -0000 *************** *** 1618,1639 **** } if (seqlen == 1) { item = PySequence_Fast_GET_ITEM(seq, 0); ! if (!PyString_Check(item) && !PyUnicode_Check(item)) { ! PyErr_Format(PyExc_TypeError, ! "sequence item 0: expected string," ! " %.80s found", ! item->ob_type->tp_name); Py_DECREF(seq); ! return NULL; } - Py_INCREF(item); - Py_DECREF(seq); - return item; } ! /* There are at least two things to join. Do a pre-pass to figure out ! * the total amount of space we'll need (sz), see whether any argument ! * is absurd, and defer to the Unicode join if appropriate. */ for (i = 0; i < seqlen; i++) { const size_t old_sz = sz; --- 1618,1635 ---- } if (seqlen == 1) { item = PySequence_Fast_GET_ITEM(seq, 0); ! if (PyString_CheckExact(item) || PyUnicode_CheckExact(item)) { ! Py_INCREF(item); Py_DECREF(seq); ! return item; } } ! /* There are at least two things to join, or else we have a subclass ! * of the builtin types in the sequence. ! * Do a pre-pass to figure out the total amount of space we'll ! * need (sz), see whether any argument is absurd, and defer to ! * the Unicode join if appropriate. */ for (i = 0; i < seqlen; i++) { const size_t old_sz = sz;