[Python-checkins] cpython: Optimize PyUnicode_Copy(): don't recompute maximum character
victor.stinner
python-checkins at python.org
Sat Oct 1 02:49:28 CEST 2011
http://hg.python.org/cpython/rev/b47e8c50a6a0
changeset: 72551:b47e8c50a6a0
user: Victor Stinner <victor.stinner at haypocalc.com>
date: Sat Oct 01 01:34:32 2011 +0200
summary:
Optimize PyUnicode_Copy(): don't recompute maximum character
files:
Objects/unicodeobject.c | 31 ++++++++++++++++++++++++++--
1 files changed, 28 insertions(+), 3 deletions(-)
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -1212,15 +1212,40 @@
PyObject*
PyUnicode_Copy(PyObject *unicode)
{
+ Py_ssize_t size;
+ PyObject *copy;
+ void *data;
+
if (!PyUnicode_Check(unicode)) {
PyErr_BadInternalCall();
return NULL;
}
if (PyUnicode_READY(unicode))
return NULL;
- return PyUnicode_FromKindAndData(PyUnicode_KIND(unicode),
- PyUnicode_DATA(unicode),
- PyUnicode_GET_LENGTH(unicode));
+
+ size = PyUnicode_GET_LENGTH(unicode);
+ copy = PyUnicode_New(size, PyUnicode_MAX_CHAR_VALUE(unicode));
+ if (!copy)
+ return NULL;
+ assert(PyUnicode_KIND(copy) == PyUnicode_KIND(unicode));
+
+ data = PyUnicode_DATA(unicode);
+ switch (PyUnicode_KIND(unicode))
+ {
+ case PyUnicode_1BYTE_KIND:
+ memcpy(PyUnicode_1BYTE_DATA(copy), data, size);
+ break;
+ case PyUnicode_2BYTE_KIND:
+ memcpy(PyUnicode_2BYTE_DATA(copy), data, sizeof(Py_UCS2) * size);
+ break;
+ case PyUnicode_4BYTE_KIND:
+ memcpy(PyUnicode_4BYTE_DATA(copy), data, sizeof(Py_UCS4) * size);
+ break;
+ default:
+ assert(0);
+ break;
+ }
+ return copy;
}
--
Repository URL: http://hg.python.org/cpython
More information about the Python-checkins
mailing list