]> granicus.if.org Git - python/commitdiff
fix #4211: the __path__ of a frozen package should be a list.
authorBenjamin Peterson <benjamin@python.org>
Wed, 5 Nov 2008 22:48:33 +0000 (22:48 +0000)
committerBenjamin Peterson <benjamin@python.org>
Wed, 5 Nov 2008 22:48:33 +0000 (22:48 +0000)
Patch by Brett Cannon, review by Christian Heimes.

Lib/test/test_frozen.py
Misc/NEWS
Python/import.c

index 545941bedc7d277bed5615d4020e1abd9605f510..ab7b52f5f5a7e9b5d081a00d585b6bc8befad493 100644 (file)
@@ -22,6 +22,7 @@ class FrozenTests(unittest.TestCase):
             self.assertEqual(len(dir(__phello__)), 7, dir(__phello__))
         else:
             self.assertEqual(len(dir(__phello__)), 8, dir(__phello__))
+        self.assertEquals(__phello__.__path__, [__phello__.__name__])
 
         try:
             import __phello__.spam
index e422b38055be58fe941ca13db4888cfe862a928e..40acabd2d387fab0af1aed7fea8ddce71fb89196 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -15,6 +15,9 @@ What's New in Python 3.0 beta 5
 Core and Builtins
 -----------------
 
+- Issue #4211: The __path__ attribute of frozen packages is now a list instead
+  of a string as required by PEP 302.
+
 - Issue #3727: Fixed poplib
 
 - Issue #3714: Fixed nntplib by using bytes where appropriate.
index 9c077fe8a66dd7865a1fde6136d7bd4dcb36fd41..564ace88b3ac073244365e0b3ca3ef90d117be30 100644 (file)
@@ -1293,37 +1293,16 @@ find_module(char *fullname, char *subname, PyObject *path, char *buf,
                Py_DECREF(meta_path);
        }
 
-       if (path != NULL && PyUnicode_Check(path)) {
-               /* The only type of submodule allowed inside a "frozen"
-                  package are other frozen modules or packages. */
-               char *p = _PyUnicode_AsString(path);
-               if (strlen(p) + 1 + strlen(name) >= (size_t)buflen) {
-                       PyErr_SetString(PyExc_ImportError,
-                                       "full frozen module name too long");
-                       return NULL;
-               }
-               strcpy(buf, p);
-               strcat(buf, ".");
-               strcat(buf, name);
-               strcpy(name, buf);
-               if (find_frozen(name) != NULL) {
-                       strcpy(buf, name);
-                       return &fd_frozen;
-               }
-               PyErr_Format(PyExc_ImportError,
-                            "No frozen submodule named %.200s", name);
-               return NULL;
+       if (find_frozen(fullname) != NULL) {
+               strcpy(buf, fullname);
+               return &fd_frozen;
        }
+
        if (path == NULL) {
                if (is_builtin(name)) {
                        strcpy(buf, name);
                        return &fd_builtin;
                }
-               if ((find_frozen(name)) != NULL) {
-                       strcpy(buf, name);
-                       return &fd_frozen;
-               }
-
 #ifdef MS_COREDLL
                fp = PyWin_FindRegisteredModule(name, &fdp, buf, buflen);
                if (fp != NULL) {
@@ -1333,6 +1312,7 @@ find_module(char *fullname, char *subname, PyObject *path, char *buf,
 #endif
                path = PySys_GetObject("path");
        }
+
        if (path == NULL || !PyList_Check(path)) {
                PyErr_SetString(PyExc_ImportError,
                                "sys.path must be a list of directory names");
@@ -1886,6 +1866,9 @@ find_frozen(char *name)
 {
        struct _frozen *p;
 
+       if (!name)
+               return NULL;
+
        for (p = PyImport_FrozenModules; ; p++) {
                if (p->name == NULL)
                        return NULL;
@@ -1959,7 +1942,7 @@ PyImport_ImportFrozenModule(char *name)
        }
        if (ispackage) {
                /* Set __path__ to the package name */
-               PyObject *d, *s;
+               PyObject *d, *s, *l;
                int err;
                m = PyImport_AddModule(name);
                if (m == NULL)
@@ -1968,8 +1951,14 @@ PyImport_ImportFrozenModule(char *name)
                s = PyUnicode_InternFromString(name);
                if (s == NULL)
                        goto err_return;
-               err = PyDict_SetItemString(d, "__path__", s);
-               Py_DECREF(s);
+               l = PyList_New(1);
+               if (l == NULL) {
+                       Py_DECREF(s);
+                       goto err_return;
+               }
+               PyList_SET_ITEM(l, 0, s);
+               err = PyDict_SetItemString(d, "__path__", l);
+               Py_DECREF(l);
                if (err != 0)
                        goto err_return;
        }