From: Phillip J. Eby Date: Thu, 23 Sep 2004 05:19:27 +0000 (+0000) Subject: Fix for SF bug #1029475 : reload() doesn't work with PEP 302 loaders. X-Git-Tag: v2.3.5c1~109 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=521cbc37af8912781d58336c8bb1fd523b91c421;p=thirdparty%2FPython%2Fcpython.git Fix for SF bug #1029475 : reload() doesn't work with PEP 302 loaders. (Backport to 2.3 maintenance branch.) --- diff --git a/Lib/test/test_importhooks.py b/Lib/test/test_importhooks.py index 4191a173a559..5ece533579ad 100644 --- a/Lib/test/test_importhooks.py +++ b/Lib/test/test_importhooks.py @@ -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) diff --git a/Python/import.c b/Python/import.c index 11aa2b4571fd..3ca10beabaf7 100644 --- a/Python/import.c +++ b/Python/import.c @@ -2310,7 +2310,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; @@ -2352,11 +2352,14 @@ 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; - m = load_module(name, fp, buf, fdp->type, NULL); + } + m = load_module(name, fp, buf, fdp->type, loader); + Py_XDECREF(loader); if (fp) fclose(fp); return m;