Optimize PyUnicode_Copy(): don't recompute maximum character
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index 810ac1e..fb02599 100644
--- 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;
}