[Python-checkins] cpython: get_sourcefile(): use PyUnicode_READ() to avoid the creation of a temporary

victor.stinner python-checkins at python.org
Sat Jun 16 03:24:25 CEST 2012


http://hg.python.org/cpython/rev/b1f63680f5cb
changeset:   77464:b1f63680f5cb
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Sat Jun 16 03:22:05 2012 +0200
summary:
  get_sourcefile(): use PyUnicode_READ() to avoid the creation of a temporary
Py_UCS4 buffer

files:
  Python/import.c |  23 +++++++++++------------
  1 files changed, 11 insertions(+), 12 deletions(-)


diff --git a/Python/import.c b/Python/import.c
--- a/Python/import.c
+++ b/Python/import.c
@@ -1008,23 +1008,25 @@
 get_sourcefile(PyObject *filename)
 {
     Py_ssize_t len;
-    Py_UCS4 *fileuni;
     PyObject *py;
     struct stat statbuf;
     int err;
+    void *data;
+    unsigned int kind;
 
     len = PyUnicode_GET_LENGTH(filename);
     if (len == 0)
         Py_RETURN_NONE;
 
     /* don't match *.pyc or *.pyo? */
-    fileuni = PyUnicode_AsUCS4Copy(filename);
-    if (!fileuni)
-        return NULL;
+    data = PyUnicode_DATA(filename);
+    kind = PyUnicode_KIND(filename);
     if (len < 5
-        || fileuni[len-4] != '.'
-        || (fileuni[len-3] != 'p' && fileuni[len-3] != 'P')
-        || (fileuni[len-2] != 'y' && fileuni[len-2] != 'Y'))
+        || PyUnicode_READ(kind, data, len-4) != '.'
+        || (PyUnicode_READ(kind, data, len-3) != 'p'
+            && PyUnicode_READ(kind, data, len-3) != 'P')
+        || (PyUnicode_READ(kind, data, len-2) != 'y'
+            && PyUnicode_READ(kind, data, len-2) != 'Y'))
         goto unchanged;
 
     /* Start by trying to turn PEP 3147 path into source path.  If that
@@ -1034,7 +1036,7 @@
     py = make_source_pathname(filename);
     if (py == NULL) {
         PyErr_Clear();
-        py = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, fileuni, len - 1);
+        py = PyUnicode_Substring(filename, 0, len - 1);
     }
     if (py == NULL)
         goto error;
@@ -1042,17 +1044,14 @@
     err = _Py_stat(py, &statbuf);
     if (err == -2)
         goto error;
-    if (err == 0 && S_ISREG(statbuf.st_mode)) {
-        PyMem_Free(fileuni);
+    if (err == 0 && S_ISREG(statbuf.st_mode))
         return py;
-    }
     Py_DECREF(py);
     goto unchanged;
 
 error:
     PyErr_Clear();
 unchanged:
-    PyMem_Free(fileuni);
     Py_INCREF(filename);
     return filename;
 }

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list