[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