summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2013-04-14 16:56:46 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2013-04-14 16:56:46 (GMT)
commit4560f9c63f091617b79950b26260f7715693de5e (patch)
tree18e9b9e41e7d76249c7cc337666972ac8c84538e /Objects
parent55c08781e8bcbba18e016060e47aabc754fddc79 (diff)
downloadcpython-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.c48
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);