diff options
Diffstat (limited to 'Python')
| -rw-r--r-- | Python/import.c | 26 | 
1 files changed, 24 insertions, 2 deletions
| diff --git a/Python/import.c b/Python/import.c index a581c4f..d62815e 100644 --- a/Python/import.c +++ b/Python/import.c @@ -1306,7 +1306,8 @@ PyImport_ReloadModule(m)  	PyObject *m;  {  	PyObject *modules = PyImport_GetModuleDict(); -	char *name; +	PyObject *path = NULL; +	char *name, *subname;  	char buf[MAXPATHLEN+1];  	struct filedescr *fdp;  	FILE *fp = NULL; @@ -1325,8 +1326,29 @@ PyImport_ReloadModule(m)  			     name);  		return NULL;  	} +	subname = strrchr(name, '.'); +	if (subname == NULL) +		subname = name; +	else { +		PyObject *parentname, *parent; +		parentname = PyString_FromStringAndSize(name, (subname-name)); +		if (parentname == NULL) +			return NULL; +		parent = PyDict_GetItem(modules, parentname); +		if (parent == NULL) { +			PyErr_Format(PyExc_ImportError, +			    "reload(): parent %.200s not in sys.modules", +			    name); +			return NULL; +		} +		subname++; +		path = PyObject_GetAttrString(parent, "__path__"); +		if (path == NULL) +			PyErr_Clear(); +	}  	buf[0] = '\0'; -	fdp = find_module(name, (PyObject *)NULL, buf, MAXPATHLEN+1, &fp); +	fdp = find_module(subname, path, buf, MAXPATHLEN+1, &fp); +	Py_XDECREF(path);  	if (fdp == NULL)  		return NULL;  	m = load_module(name, fp, buf, fdp->type); | 
