[Python-checkins] r82692 - python/branches/import_unicode/Python/import.c

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


Author: victor.stinner
Date: Fri Jul  9 01:32:52 2010
New Revision: 82692

Log:
change find_module() API: path is stored as an object

fix also refleaks in functions calling find_module()

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

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:52 2010
@@ -1466,7 +1466,7 @@
 /* Forward */
 static PyObject *load_module(char *, FILE *, PyObject *, int, PyObject *);
 static struct filedescr *find_module(char *, char *, PyObject *,
-                                     char *, size_t, FILE **, PyObject **);
+                                     PyObject **, FILE **, PyObject **);
 static struct _frozen * find_frozen(char *);
 
 /* Load a package and return its module object WITH INCREMENTED
@@ -1479,7 +1479,6 @@
     PyObject *file = NULL;
     PyObject *path = NULL;
     int err;
-    char buf[MAXPATHLEN+1];
     FILE *fp = NULL;
     struct filedescr *fdp;
     PyObject *bufobj;
@@ -1501,8 +1500,7 @@
         err = PyDict_SetItemString(d, "__path__", path);
     if (err != 0)
         goto error;
-    buf[0] = '\0';
-    fdp = find_module(name, "__init__", path, buf, sizeof(buf), &fp, NULL);
+    fdp = find_module(name, "__init__", path, &bufobj, &fp, NULL);
     if (fdp == NULL) {
         if (PyErr_ExceptionMatches(PyExc_ImportError)) {
             PyErr_Clear();
@@ -1512,11 +1510,7 @@
             m = NULL;
         goto cleanup;
     }
-    bufobj = PyUnicode_DecodeFSDefault(buf);
-    if (bufobj != NULL)
-        m = load_module(name, fp, bufobj, fdp->type, NULL);
-    else
-        m = NULL;
+    m = load_module(name, fp, bufobj, fdp->type, NULL);
     if (fp != NULL)
         fclose(fp);
     goto cleanup;
@@ -1640,7 +1634,7 @@
 static struct filedescr importhookdescr = {"", "", IMP_HOOK};
 
 static struct filedescr *
-find_module(char *fullname, char *subname, PyObject *path, char *buf,
+_find_module(char *fullname, char *subname, PyObject *path, char *buf,
             size_t buflen, FILE **p_fp, PyObject **p_loader)
 {
     Py_ssize_t i, npath;
@@ -1912,6 +1906,28 @@
     return fdp;
 }
 
+static struct filedescr *
+find_module(char *fullname, char *subname, PyObject *path, PyObject **result,
+            FILE **p_fp, PyObject **p_loader)
+{
+    char buf[MAXPATHLEN+1];
+    struct filedescr *fd;
+    buf[0] = '\0';
+    fd = _find_module(fullname, subname, path,
+                      buf, sizeof(buf),
+                      p_fp, p_loader);
+    if (fd != NULL) {
+        *result = PyUnicode_DecodeFSDefault(buf);
+        if (*result == NULL) {
+            if (*p_fp != NULL)
+                fclose(*p_fp);
+            return NULL;
+        }
+    } else
+        *result = NULL;
+    return fd;
+}
+
 /* Helpers for main.c
  *  Find the source file corresponding to a named module
  */
@@ -2974,7 +2990,6 @@
     }
     else {
         PyObject *path, *loader = NULL;
-        char buf[MAXPATHLEN+1];
         struct filedescr *fdp;
         FILE *fp = NULL;
 
@@ -2989,8 +3004,7 @@
             }
         }
 
-        buf[0] = '\0';
-        fdp = find_module(fullname, subname, path, buf, MAXPATHLEN+1,
+        fdp = find_module(fullname, subname, path, &pathobj,
                           &fp, &loader);
         Py_XDECREF(path);
         if (fdp == NULL) {
@@ -3000,11 +3014,8 @@
             Py_INCREF(Py_None);
             return Py_None;
         }
-        pathobj = PyUnicode_DecodeFSDefault(buf);
-        if (pathobj != NULL)
-            m = load_module(fullname, fp, pathobj, fdp->type, loader);
-        else
-            m = NULL;
+        m = load_module(fullname, fp, pathobj, fdp->type, loader);
+        Py_DECREF(pathobj);
         Py_XDECREF(loader);
         if (fp)
             fclose(fp);
@@ -3029,7 +3040,6 @@
     PyObject *modules = PyImport_GetModuleDict();
     PyObject *path = NULL, *loader = NULL, *existing_m = NULL;
     char *name, *subname;
-    char buf[MAXPATHLEN+1];
     struct filedescr *fdp;
     FILE *fp = NULL;
     PyObject *pathobj;
@@ -3090,8 +3100,7 @@
         if (path == NULL)
             PyErr_Clear();
     }
-    buf[0] = '\0';
-    fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, &loader);
+    fdp = find_module(name, subname, path, &pathobj, &fp, &loader);
     Py_XDECREF(path);
 
     if (fdp == NULL) {
@@ -3100,11 +3109,8 @@
         return NULL;
     }
 
-    pathobj = PyUnicode_DecodeFSDefault(buf);
-    if (pathobj != NULL)
-        newm = load_module(name, fp, pathobj, fdp->type, loader);
-    else
-        newm = NULL;
+    newm = load_module(name, fp, pathobj, fdp->type, loader);
+    Py_DECREF(pathobj);
     Py_XDECREF(loader);
 
     if (fp)
@@ -3261,21 +3267,16 @@
     PyObject *fob, *ret;
     PyObject *pathobj;
     struct filedescr *fdp;
-    char pathname[MAXPATHLEN+1];
     FILE *fp = NULL;
     int fd = -1;
     char *found_encoding = NULL;
     char *encoding = NULL;
 
-    pathname[0] = '\0';
     if (path == Py_None)
         path = NULL;
-    fdp = find_module(NULL, name, path, pathname, MAXPATHLEN+1, &fp, NULL);
+    fdp = find_module(NULL, name, path, &pathobj, &fp, NULL);
     if (fdp == NULL)
         return NULL;
-    pathobj = PyUnicode_DecodeFSDefault(pathname);
-    if (pathobj == NULL)
-        return NULL;
     if (fp != NULL) {
         fd = fileno(fp);
         if (fd != -1)
@@ -3289,8 +3290,10 @@
                memory. */
             found_encoding = PyTokenizer_FindEncoding(fd);
             lseek(fd, 0, 0); /* Reset position */
-            if (found_encoding == NULL && PyErr_Occurred())
+            if (found_encoding == NULL && PyErr_Occurred()) {
+                Py_DECREF(pathobj);
                 return NULL;
+            }
             encoding = (found_encoding != NULL) ? found_encoding :
                    (char*)PyUnicode_GetDefaultEncoding();
         }
@@ -3298,6 +3301,7 @@
                                     encoding, NULL, NULL, 1);
         if (fob == NULL) {
             close(fd);
+            Py_DECREF(pathobj);
             PyMem_FREE(found_encoding);
             return NULL;
         }


More information about the Python-checkins mailing list