PyUnicode_Join(): move use_memcpy test out of the loop to cleanup and optimize the code

This commit is contained in:
Victor Stinner 2013-04-14 18:56:46 +02:00
parent 55c08781e8
commit 4560f9c63f
1 changed files with 28 additions and 20 deletions

View File

@ -9466,41 +9466,49 @@ PyUnicode_Join(PyObject *separator, PyObject *seq)
sep_data = PyUnicode_1BYTE_DATA(sep); sep_data = PyUnicode_1BYTE_DATA(sep);
} }
#endif #endif
for (i = 0, res_offset = 0; i < seqlen; ++i) { if (use_memcpy) {
Py_ssize_t itemlen; for (i = 0; i < seqlen; ++i) {
item = items[i]; Py_ssize_t itemlen;
/* Copy item, and maybe the separator. */ item = items[i];
if (i && seplen != 0) {
if (use_memcpy) { /* Copy item, and maybe the separator. */
if (i && seplen != 0) {
Py_MEMCPY(res_data, Py_MEMCPY(res_data,
sep_data, sep_data,
kind * seplen); kind * seplen);
res_data += kind * seplen; res_data += kind * seplen;
} }
else {
_PyUnicode_FastCopyCharacters(res, res_offset, sep, 0, seplen); itemlen = PyUnicode_GET_LENGTH(item);
res_offset += seplen; if (itemlen != 0) {
}
}
itemlen = PyUnicode_GET_LENGTH(item);
if (itemlen != 0) {
if (use_memcpy) {
Py_MEMCPY(res_data, Py_MEMCPY(res_data,
PyUnicode_DATA(item), PyUnicode_DATA(item),
kind * itemlen); kind * itemlen);
res_data += 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); _PyUnicode_FastCopyCharacters(res, res_offset, item, 0, itemlen);
res_offset += 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)); assert(res_offset == PyUnicode_GET_LENGTH(res));
}
Py_DECREF(fseq); Py_DECREF(fseq);
Py_XDECREF(sep); Py_XDECREF(sep);