summaryrefslogtreecommitdiff
path: root/Python/import.c
diff options
context:
space:
mode:
authorBrett Cannon <brett@python.org>2012-04-15 17:56:09 -0400
committerBrett Cannon <brett@python.org>2012-04-15 17:56:09 -0400
commit8a1d04c64372d4706572671a21ff9d3e4a6374ca (patch)
treedb9e9c2ade3bdf16d917f61a76a2e27ee524af05 /Python/import.c
parent7ceedb8c1ec96f3aa1db9e7d2aed89c70481caad (diff)
downloadcpython-git-8a1d04c64372d4706572671a21ff9d3e4a6374ca.tar.gz
Issue #13959: Simplify imp.reload() by relying on a module's
__loader__. Since import now sets __loader__ on all modules it creates and imp.reload() already relied on the attribute for modules that import didn't create, the only potential compatibility issue is if people were deleting the attribute on modules and expecting imp.reload() to continue to work.
Diffstat (limited to 'Python/import.c')
-rw-r--r--Python/import.c44
1 files changed, 10 insertions, 34 deletions
diff --git a/Python/import.c b/Python/import.c
index a930382fc7..747b0ddff4 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -153,7 +153,6 @@ static const struct filedescr _PyImport_StandardFiletab[] = {
};
static PyObject *initstr = NULL;
-_Py_IDENTIFIER(__path__);
/* Initialize things */
@@ -3106,12 +3105,12 @@ PyImport_ReloadModule(PyObject *m)
PyInterpreterState *interp = PyThreadState_Get()->interp;
PyObject *modules_reloading = interp->modules_reloading;
PyObject *modules = PyImport_GetModuleDict();
- PyObject *path_list = NULL, *loader = NULL, *existing_m = NULL;
- PyObject *name, *bufobj, *subname;
+ PyObject *loader = NULL, *existing_m = NULL;
+ PyObject *name;
Py_ssize_t subname_start;
- struct filedescr *fdp;
- FILE *fp = NULL;
PyObject *newm = NULL;
+ _Py_IDENTIFIER(__loader__);
+ _Py_IDENTIFIER(load_module);
if (modules_reloading == NULL) {
Py_FatalError("PyImport_ReloadModule: "
@@ -3149,51 +3148,28 @@ PyImport_ReloadModule(PyObject *m)
subname_start = PyUnicode_FindChar(name, '.', 0,
PyUnicode_GET_LENGTH(name), -1);
- if (subname_start == -1) {
- Py_INCREF(name);
- subname = name;
- }
- else {
+ if (subname_start != -1) {
PyObject *parentname, *parent;
- Py_ssize_t len;
parentname = PyUnicode_Substring(name, 0, subname_start);
if (parentname == NULL) {
goto error;
}
parent = PyDict_GetItem(modules, parentname);
+ Py_XDECREF(parent);
if (parent == NULL) {
PyErr_Format(PyExc_ImportError,
"reload(): parent %R not in sys.modules",
parentname);
- Py_DECREF(parentname);
goto error;
}
- Py_DECREF(parentname);
- path_list = _PyObject_GetAttrId(parent, &PyId___path__);
- if (path_list == NULL)
- PyErr_Clear();
- subname_start++;
- len = PyUnicode_GET_LENGTH(name) - (subname_start + 1);
- subname = PyUnicode_Substring(name, subname_start, len);
}
- if (subname == NULL)
- goto error;
- fdp = find_module(name, subname, path_list,
- &bufobj, &fp, &loader);
- Py_DECREF(subname);
- Py_XDECREF(path_list);
- if (fdp == NULL) {
- Py_XDECREF(loader);
+ loader = _PyObject_GetAttrId(m, &PyId___loader__);
+ if (loader == NULL) {
goto error;
}
-
- newm = load_module(name, fp, bufobj, fdp->type, loader);
- Py_XDECREF(bufobj);
- Py_XDECREF(loader);
-
- if (fp)
- fclose(fp);
+ newm = _PyObject_CallMethodId(loader, &PyId_load_module, "O", name);
+ Py_DECREF(loader);
if (newm == NULL) {
/* load_module probably removed name from modules because of
* the error. Put back the original module object. We're