[Python-checkins] r82673 - in python/branches/import_unicode: Include/import.h Python/import.c

victor.stinner python-checkins at python.org
Fri Jul 9 01:32:24 CEST 2010


Author: victor.stinner
Date: Fri Jul  9 01:32:24 2010
New Revision: 82673

Log:
Create PyImport_ExecCodeModuleWithUnicodePathnames()

I love long function names!

Modified:
   python/branches/import_unicode/Include/import.h
   python/branches/import_unicode/Python/import.c

Modified: python/branches/import_unicode/Include/import.h
==============================================================================
--- python/branches/import_unicode/Include/import.h	(original)
+++ python/branches/import_unicode/Include/import.h	Fri Jul  9 01:32:24 2010
@@ -17,6 +17,11 @@
     PyObject *co,
     char *pathname,
     char *cpathname);
+PyAPI_FUNC(PyObject *) PyImport_ExecCodeModuleWithUnicodePathnames(
+    char *name,
+    PyObject *co,
+    PyObject *pathname,
+    PyObject *cpathname);
 PyAPI_FUNC(PyObject *) PyImport_GetModuleDict(void);
 PyAPI_FUNC(PyObject *) PyImport_AddModule(const char *name);
 PyAPI_FUNC(PyObject *) PyImport_ImportModule(const char *name);

Modified: python/branches/import_unicode/Python/import.c
==============================================================================
--- python/branches/import_unicode/Python/import.c	(original)
+++ python/branches/import_unicode/Python/import.c	Fri Jul  9 01:32:24 2010
@@ -736,8 +736,8 @@
 PyObject *
 PyImport_ExecCodeModule(char *name, PyObject *co)
 {
-    return PyImport_ExecCodeModuleWithPathnames(
-        name, co, (char *)NULL, (char *)NULL);
+    return PyImport_ExecCodeModuleWithUnicodePathnames(
+        name, co, NULL, NULL);
 }
 
 PyObject *
@@ -748,8 +748,8 @@
 }
 
 PyObject *
-PyImport_ExecCodeModuleWithPathnames(char *name, PyObject *co, char *pathname,
-                                     char *cpathname)
+PyImport_ExecCodeModuleWithUnicodePathnames(char *name, PyObject *co,
+                                            PyObject *pathobj, PyObject *cpathobj)
 {
     PyObject *modules = PyImport_GetModuleDict();
     PyObject *m, *d, *v;
@@ -767,11 +767,8 @@
     }
     /* Remember the filename as the __file__ attribute */
     v = NULL;
-    if (pathname != NULL) {
-        PyObject *pathobj = PyUnicode_DecodeFSDefault(pathname);
-        /* FIXME: check pathobj != NULL */
+    if (pathobj != NULL) {
         v = get_sourcefile(pathobj);
-        Py_DECREF(pathobj);
         if (v == NULL)
             PyErr_Clear();
     }
@@ -784,18 +781,12 @@
     Py_DECREF(v);
 
     /* Remember the pyc path name as the __cached__ attribute. */
-    if (cpathname == NULL) {
-        v = Py_None;
-        Py_INCREF(v);
-    }
-    else if ((v = PyUnicode_FromString(cpathname)) == NULL) {
-        PyErr_Clear(); /* Not important enough to report */
+    if (cpathobj != NULL)
+        v = cpathobj;
+    else
         v = Py_None;
-        Py_INCREF(v);
-    }
     if (PyDict_SetItemString(d, "__cached__", v) != 0)
         PyErr_Clear(); /* Not important enough to report */
-    Py_DECREF(v);
 
     v = PyEval_EvalCode((PyCodeObject *)co, d, d);
     if (v == NULL)
@@ -818,6 +809,29 @@
     return NULL;
 }
 
+PyObject *
+PyImport_ExecCodeModuleWithPathnames(char *name, PyObject *co, char *pathname,
+                                     char *cpathname)
+{
+    PyObject *m, *pathobj, *cpathobj;
+    if (pathname != NULL) {
+        pathobj = PyUnicode_DecodeFSDefault(pathname);
+        if (pathobj == NULL)
+            return NULL;
+    } else
+        pathobj = NULL;
+    if (cpathname != NULL) {
+        cpathobj = PyUnicode_DecodeFSDefault(cpathname);
+        if (cpathobj == NULL)
+            PyErr_Clear(); /* Not important enough to report */
+    } else
+        cpathobj = NULL;
+    m = PyImport_ExecCodeModuleWithUnicodePathnames(name, co, pathobj, cpathobj);
+    Py_XDECREF(pathobj);
+    Py_XDECREF(cpathobj);
+    return m;
+}
+
 
 /* Like strrchr(string, '/') but searches for the rightmost of either SEP
    or ALTSEP, if the latter is defined.
@@ -1068,6 +1082,7 @@
     long magic;
     PyCodeObject *co;
     PyObject *m;
+    PyObject *cpathobj;
 
     magic = PyMarshal_ReadLongFromFile(fp);
     if (magic != pyc_magic) {
@@ -1082,8 +1097,10 @@
     if (Py_VerboseFlag)
         PySys_WriteStderr("import %s # precompiled from %s\n",
             name, cpathname);
-    m = PyImport_ExecCodeModuleWithPathnames(
-        name, (PyObject *)co, cpathname, cpathname);
+    cpathobj = PyUnicode_DecodeFSDefault(cpathname);
+    m = PyImport_ExecCodeModuleWithUnicodePathnames(
+        name, (PyObject *)co, cpathobj, cpathobj);
+    Py_DECREF(cpathobj);
     Py_DECREF(co);
 
     return m;


More information about the Python-checkins mailing list