Index: Python/import.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Python/import.c,v retrieving revision 2.219 diff -u -r2.219 import.c --- Python/import.c 17 Feb 2003 18:18:00 -0000 2.219 +++ Python/import.c 11 Mar 2003 17:46:03 -0000 @@ -2287,24 +2287,31 @@ { PyObject *modules = PyImport_GetModuleDict(); PyObject *path = NULL; + PyObject *nameobj; char *name, *subname; char buf[MAXPATHLEN+1]; struct filedescr *fdp; FILE *fp = NULL; - if (m == NULL || !PyModule_Check(m)) { + if (m == NULL) { PyErr_SetString(PyExc_TypeError, "reload() argument must be module"); return NULL; } - name = PyModule_GetName(m); - if (name == NULL) + nameobj = PyObject_GetAttrString(m, "__name__"); + if (nameobj == NULL) return NULL; - if (m != PyDict_GetItemString(modules, name)) { + if (!PyString_Check(nameobj)) { + PyErr_SetString(PyExc_TypeError, + "module name must be string"); + goto error; + } + name = PyString_AS_STRING(nameobj); + if (m != PyDict_GetItem(modules, nameobj)) { PyErr_Format(PyExc_ImportError, "reload(): module %.200s not in sys.modules", name); - return NULL; + goto error; } subname = strrchr(name, '.'); if (subname == NULL) @@ -2313,14 +2320,14 @@ PyObject *parentname, *parent; parentname = PyString_FromStringAndSize(name, (subname-name)); if (parentname == NULL) - return NULL; + goto error; parent = PyDict_GetItem(modules, parentname); Py_DECREF(parentname); if (parent == NULL) { PyErr_Format(PyExc_ImportError, "reload(): parent %.200s not in sys.modules", name); - return NULL; + goto error; } subname++; path = PyObject_GetAttrString(parent, "__path__"); @@ -2331,11 +2338,15 @@ fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, NULL); Py_XDECREF(path); if (fdp == NULL) - return NULL; + goto error; m = load_module(name, fp, buf, fdp->type, NULL); if (fp) fclose(fp); return m; + + error: + Py_DECREF(nameobj); + return NULL; }