Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7ec642a

Browse files
committed
Fix for SF bug #1029475 : reload() doesn't work with PEP 302 loaders.
1 parent f4aca75 commit 7ec642a

2 files changed

Lines changed: 26 additions & 6 deletions

File tree

Lib/test/test_importhooks.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,13 @@ def get_file():
1212
return __file__
1313
"""
1414

15+
reload_src = test_src+"""\
16+
reloaded = True
17+
"""
18+
1519
test_co = compile(test_src, "<???>", "exec")
20+
reload_co = compile(reload_src, "<???>", "exec")
21+
1622
test_path = "!!!_test_!!!"
1723

1824

@@ -32,6 +38,7 @@ class TestImporter:
3238
"hooktestpackage": (True, test_co),
3339
"hooktestpackage.sub": (True, test_co),
3440
"hooktestpackage.sub.subber": (False, test_co),
41+
"reloadmodule": (False, test_co),
3542
}
3643

3744
def __init__(self, path=test_path):
@@ -52,8 +59,7 @@ def find_module(self, fullname, path=None):
5259

5360
def load_module(self, fullname):
5461
ispkg, code = self.modules[fullname]
55-
mod = imp.new_module(fullname)
56-
sys.modules[fullname] = mod
62+
mod = sys.modules.setdefault(fullname,imp.new_module(fullname))
5763
mod.__file__ = "<%s>" % self.__class__.__name__
5864
mod.__loader__ = self
5965
if ispkg:
@@ -163,6 +169,14 @@ def doTestImports(self, importer=None):
163169
self.assertEqual(hooktestpackage.sub.__loader__, importer)
164170
self.assertEqual(hooktestpackage.sub.subber.__loader__, importer)
165171

172+
TestImporter.modules['reloadmodule'] = (False, test_co)
173+
import reloadmodule
174+
self.failIf(hasattr(reloadmodule,'reloaded'))
175+
176+
TestImporter.modules['reloadmodule'] = (False, reload_co)
177+
reload(reloadmodule)
178+
self.failUnless(hasattr(reloadmodule,'reloaded'))
179+
166180
def testMetaPath(self):
167181
i = MetaImporter()
168182
sys.meta_path.append(i)

Python/import.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2252,7 +2252,7 @@ PyObject *
22522252
PyImport_ReloadModule(PyObject *m)
22532253
{
22542254
PyObject *modules = PyImport_GetModuleDict();
2255-
PyObject *path = NULL;
2255+
PyObject *path = NULL, *loader = NULL;
22562256
char *name, *subname;
22572257
char buf[MAXPATHLEN+1];
22582258
struct filedescr *fdp;
@@ -2295,11 +2295,17 @@ PyImport_ReloadModule(PyObject *m)
22952295
PyErr_Clear();
22962296
}
22972297
buf[0] = '\0';
2298-
fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, NULL);
2298+
fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, &loader);
22992299
Py_XDECREF(path);
2300-
if (fdp == NULL)
2300+
2301+
if (fdp == NULL) {
2302+
Py_XDECREF(loader);
23012303
return NULL;
2302-
newm = load_module(name, fp, buf, fdp->type, NULL);
2304+
}
2305+
2306+
newm = load_module(name, fp, buf, fdp->type, loader);
2307+
Py_XDECREF(loader);
2308+
23032309
if (fp)
23042310
fclose(fp);
23052311
if (newm == NULL) {

0 commit comments

Comments
 (0)