diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2013-04-14 16:56:46 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2013-04-14 16:56:46 (GMT) |
commit | 4560f9c63f091617b79950b26260f7715693de5e (patch) | |
tree | 18e9b9e41e7d76249c7cc337666972ac8c84538e /Objects | |
parent | 55c08781e8bcbba18e016060e47aabc754fddc79 (diff) | |
download | cpython-4560f9c63f091617b79950b26260f7715693de5e.zip cpython-4560f9c63f091617b79950b26260f7715693de5e.tar.gz cpython-4560f9c63f091617b79950b26260f7715693de5e.tar.bz2 |
PyUnicode_Join(): move use_memcpy test out of the loop to cleanup and optimize the code
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/unicodeobject.c | 48 |
1 files changed, 28 insertions, 20 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 907fa5a..cd2acc0 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -9466,41 +9466,49 @@ PyUnicode_Join(PyObject *separator, PyObject *seq) sep_data = PyUnicode_1BYTE_DATA(sep); } #endif - for (i = 0, res_offset = 0; i < seqlen; ++i) { - Py_ssize_t itemlen; - item = items[i]; - /* Copy item, and maybe the separator. */ - if (i && seplen != 0) { - if (use_memcpy) { + if (use_memcpy) { + for (i = 0; i < seqlen; ++i) { + Py_ssize_t itemlen; + item = items[i]; + + /* Copy item, and maybe the separator. */ + if (i && seplen != 0) { Py_MEMCPY(res_data, sep_data, kind * seplen); res_data += kind * seplen; } - else { - _PyUnicode_FastCopyCharacters(res, res_offset, sep, 0, seplen); - res_offset += seplen; - } - } - itemlen = PyUnicode_GET_LENGTH(item); - if (itemlen != 0) { - if (use_memcpy) { + + itemlen = PyUnicode_GET_LENGTH(item); + if (itemlen != 0) { Py_MEMCPY(res_data, PyUnicode_DATA(item), kind * itemlen); res_data += kind * itemlen; } - else { + } + assert(res_data == PyUnicode_1BYTE_DATA(res) + + kind * PyUnicode_GET_LENGTH(res)); + } + else { + for (i = 0, res_offset = 0; i < seqlen; ++i) { + Py_ssize_t itemlen; + item = items[i]; + + /* Copy item, and maybe the separator. */ + if (i && seplen != 0) { + _PyUnicode_FastCopyCharacters(res, res_offset, sep, 0, seplen); + res_offset += seplen; + } + + itemlen = PyUnicode_GET_LENGTH(item); + if (itemlen != 0) { _PyUnicode_FastCopyCharacters(res, res_offset, item, 0, itemlen); res_offset += itemlen; } } - } - if (use_memcpy) - assert(res_data == PyUnicode_1BYTE_DATA(res) - + kind * PyUnicode_GET_LENGTH(res)); - else assert(res_offset == PyUnicode_GET_LENGTH(res)); + } Py_DECREF(fseq); Py_XDECREF(sep); |