]> granicus.if.org Git - python/commitdiff
Fix for SF bug #1029475 : reload() doesn't work with PEP 302 loaders.
authorPhillip J. Eby <pje@telecommunity.com>
Thu, 23 Sep 2004 04:37:36 +0000 (04:37 +0000)
committerPhillip J. Eby <pje@telecommunity.com>
Thu, 23 Sep 2004 04:37:36 +0000 (04:37 +0000)
Lib/test/test_importhooks.py
Python/import.c

index 4191a173a559551ab002be2eb7f85ea1a3da8d72..5ece533579ad0a93474f2273ce6e49cf667eb815 100644 (file)
@@ -12,7 +12,13 @@ def get_file():
     return __file__
 """
 
+reload_src = test_src+"""\
+reloaded = True
+"""
+
 test_co = compile(test_src, "<???>", "exec")
+reload_co = compile(reload_src, "<???>", "exec")
+
 test_path = "!!!_test_!!!"
 
 
@@ -32,6 +38,7 @@ class TestImporter:
         "hooktestpackage": (True, test_co),
         "hooktestpackage.sub": (True, test_co),
         "hooktestpackage.sub.subber": (False, test_co),
+        "reloadmodule": (False, test_co),
     }
 
     def __init__(self, path=test_path):
@@ -52,8 +59,7 @@ class TestImporter:
 
     def load_module(self, fullname):
         ispkg, code = self.modules[fullname]
-        mod = imp.new_module(fullname)
-        sys.modules[fullname] = mod
+        mod = sys.modules.setdefault(fullname,imp.new_module(fullname))
         mod.__file__ = "<%s>" % self.__class__.__name__
         mod.__loader__ = self
         if ispkg:
@@ -163,6 +169,14 @@ class ImportHooksTestCase(ImportHooksBaseTestCase):
             self.assertEqual(hooktestpackage.sub.__loader__, importer)
             self.assertEqual(hooktestpackage.sub.subber.__loader__, importer)
 
+        TestImporter.modules['reloadmodule'] = (False, test_co)
+        import reloadmodule
+        self.failIf(hasattr(reloadmodule,'reloaded'))
+
+        TestImporter.modules['reloadmodule'] = (False, reload_co)
+        reload(reloadmodule)
+        self.failUnless(hasattr(reloadmodule,'reloaded'))
+       
     def testMetaPath(self):
         i = MetaImporter()
         sys.meta_path.append(i)
index 61e4313fbb49f8be7fff3bfc46a8e73f7a6bd057..8f81d6ef8e1bc751579075cddf3382701507e668 100644 (file)
@@ -2252,7 +2252,7 @@ PyObject *
 PyImport_ReloadModule(PyObject *m)
 {
        PyObject *modules = PyImport_GetModuleDict();
-       PyObject *path = NULL;
+       PyObject *path = NULL, *loader = NULL;
        char *name, *subname;
        char buf[MAXPATHLEN+1];
        struct filedescr *fdp;
@@ -2295,11 +2295,17 @@ PyImport_ReloadModule(PyObject *m)
                        PyErr_Clear();
        }
        buf[0] = '\0';
-       fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, NULL);
+       fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, &loader);
        Py_XDECREF(path);
-       if (fdp == NULL)
+
+       if (fdp == NULL) {
+               Py_XDECREF(loader);
                return NULL;
-       newm = load_module(name, fp, buf, fdp->type, NULL);
+       }
+
+       newm = load_module(name, fp, buf, fdp->type, loader);
+       Py_XDECREF(loader);
+
        if (fp)
                fclose(fp);
        if (newm == NULL) {