diff -r 7b420953418c Objects/bytesobject.c --- a/Objects/bytesobject.c Sun Jul 27 00:27:04 2008 +0200 +++ b/Objects/bytesobject.c Mon Jul 28 20:48:53 2008 +0200 @@ -1433,10 +1433,10 @@ string_join(PyObject *self, PyObject *or const Py_ssize_t seplen = PyBytes_GET_SIZE(self); PyObject *res = NULL; char *p; - Py_ssize_t seqlen = 0; + Py_ssize_t seqlen = 0, nb_nonempty = 0; size_t sz = 0; Py_ssize_t i; - PyObject *seq, *item; + PyObject *seq, *item, *nonempty = NULL; seq = PySequence_Fast(orig, ""); if (seq == NULL) { @@ -1465,6 +1465,7 @@ string_join(PyObject *self, PyObject *or /* XXX Shouldn't we use _getbuffer() on these items instead? */ for (i = 0; i < seqlen; i++) { const size_t old_sz = sz; + size_t item_sz; item = PySequence_Fast_GET_ITEM(seq, i); if (!PyBytes_Check(item) && !PyByteArray_Check(item)) { PyErr_Format(PyExc_TypeError, @@ -1474,7 +1475,12 @@ string_join(PyObject *self, PyObject *or Py_DECREF(seq); return NULL; } - sz += Py_SIZE(item); + item_sz = Py_SIZE(item); + if (item_sz > 0) { + nonempty = item; + nb_nonempty++; + sz += item_sz; + } if (i != 0) sz += seplen; if (sz < old_sz || sz > PY_SSIZE_T_MAX) { @@ -1482,6 +1488,20 @@ string_join(PyObject *self, PyObject *or "join() result is too long for bytes"); Py_DECREF(seq); return NULL; + } + } + + /* Shortcut when the separator is empty and there is only zero or one + non-empty item */ + if (seplen == 0) { + if (nb_nonempty == 0) { + Py_DECREF(seq); + return PyBytes_FromString(""); + } + if (nb_nonempty == 1 && PyBytes_CheckExact(nonempty)) { + Py_INCREF(nonempty); + Py_DECREF(seq); + return nonempty; } }