mirror of
https://github.com/python/cpython.git
synced 2025-10-17 12:18:23 +00:00
Issue #3080: find_module() expects module fullname and subname as Unicode
And PyImport_ReloadModule() uses Unicode for the module name.
This commit is contained in:
parent
58d37112ae
commit
ad3c03b23e
1 changed files with 84 additions and 86 deletions
160
Python/import.c
160
Python/import.c
|
@ -1491,7 +1491,7 @@ unchanged:
|
||||||
|
|
||||||
/* Forward */
|
/* Forward */
|
||||||
static PyObject *load_module(PyObject *, FILE *, PyObject *, int, PyObject *);
|
static PyObject *load_module(PyObject *, FILE *, PyObject *, int, PyObject *);
|
||||||
static struct filedescr *find_module(char *, const char *, PyObject *,
|
static struct filedescr *find_module(PyObject *, PyObject *, PyObject *,
|
||||||
char *, size_t, FILE **, PyObject **);
|
char *, size_t, FILE **, PyObject **);
|
||||||
static struct _frozen * find_frozen(PyObject *);
|
static struct _frozen * find_frozen(PyObject *);
|
||||||
|
|
||||||
|
@ -1507,7 +1507,13 @@ load_package(PyObject *name, PyObject *pathname)
|
||||||
char buf[MAXPATHLEN+1];
|
char buf[MAXPATHLEN+1];
|
||||||
FILE *fp = NULL;
|
FILE *fp = NULL;
|
||||||
struct filedescr *fdp;
|
struct filedescr *fdp;
|
||||||
char *namestr;
|
static PyObject *initstr = NULL;
|
||||||
|
|
||||||
|
if (initstr == NULL) {
|
||||||
|
initstr = PyUnicode_InternFromString("__init__");
|
||||||
|
if (initstr == NULL)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
m = PyImport_AddModuleObject(name);
|
m = PyImport_AddModuleObject(name);
|
||||||
if (m == NULL)
|
if (m == NULL)
|
||||||
|
@ -1532,10 +1538,7 @@ load_package(PyObject *name, PyObject *pathname)
|
||||||
Py_DECREF(path_list);
|
Py_DECREF(path_list);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
namestr = _PyUnicode_AsString(name);
|
fdp = find_module(name, initstr, path_list, buf, sizeof(buf), &fp, NULL);
|
||||||
if (namestr == NULL)
|
|
||||||
goto error;
|
|
||||||
fdp = find_module(namestr, "__init__", path_list, buf, sizeof(buf), &fp, NULL);
|
|
||||||
Py_DECREF(path_list);
|
Py_DECREF(path_list);
|
||||||
if (fdp == NULL) {
|
if (fdp == NULL) {
|
||||||
if (PyErr_ExceptionMatches(PyExc_ImportError)) {
|
if (PyErr_ExceptionMatches(PyExc_ImportError)) {
|
||||||
|
@ -1680,7 +1683,7 @@ static struct filedescr importhookdescr = {"", "", IMP_HOOK};
|
||||||
and *buf is the path */
|
and *buf is the path */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
find_module_path(char *fullname, const char *name, PyObject *path,
|
find_module_path(PyObject *fullname, PyObject *name, PyObject *path,
|
||||||
PyObject *path_hooks, PyObject *path_importer_cache,
|
PyObject *path_hooks, PyObject *path_importer_cache,
|
||||||
char *buf, size_t buflen,
|
char *buf, size_t buflen,
|
||||||
PyObject **p_loader, struct filedescr **p_fd)
|
PyObject **p_loader, struct filedescr **p_fd)
|
||||||
|
@ -1691,6 +1694,7 @@ find_module_path(char *fullname, const char *name, PyObject *path,
|
||||||
size_t namelen;
|
size_t namelen;
|
||||||
struct stat statbuf;
|
struct stat statbuf;
|
||||||
static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
|
static struct filedescr fd_package = {"", "", PKG_DIRECTORY};
|
||||||
|
char *namestr;
|
||||||
|
|
||||||
if (PyUnicode_Check(path)) {
|
if (PyUnicode_Check(path)) {
|
||||||
path_bytes = PyUnicode_EncodeFSDefault(path);
|
path_bytes = PyUnicode_EncodeFSDefault(path);
|
||||||
|
@ -1704,7 +1708,8 @@ find_module_path(char *fullname, const char *name, PyObject *path,
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
namelen = strlen(name);
|
namestr = _PyUnicode_AsString(name);
|
||||||
|
namelen = strlen(namestr);
|
||||||
base = PyBytes_AS_STRING(path_bytes);
|
base = PyBytes_AS_STRING(path_bytes);
|
||||||
len = PyBytes_GET_SIZE(path_bytes);
|
len = PyBytes_GET_SIZE(path_bytes);
|
||||||
if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
|
if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
|
||||||
|
@ -1731,8 +1736,7 @@ find_module_path(char *fullname, const char *name, PyObject *path,
|
||||||
if (importer != Py_None) {
|
if (importer != Py_None) {
|
||||||
PyObject *loader;
|
PyObject *loader;
|
||||||
loader = PyObject_CallMethod(importer,
|
loader = PyObject_CallMethod(importer,
|
||||||
"find_module",
|
"find_module", "O", fullname);
|
||||||
"s", fullname);
|
|
||||||
if (loader == NULL)
|
if (loader == NULL)
|
||||||
return -1; /* error */
|
return -1; /* error */
|
||||||
if (loader != Py_None) {
|
if (loader != Py_None) {
|
||||||
|
@ -1753,7 +1757,7 @@ find_module_path(char *fullname, const char *name, PyObject *path,
|
||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
buf[len++] = SEP;
|
buf[len++] = SEP;
|
||||||
strcpy(buf+len, name);
|
strcpy(buf+len, namestr);
|
||||||
len += namelen;
|
len += namelen;
|
||||||
|
|
||||||
/* Check for package import (buf holds a directory name,
|
/* Check for package import (buf holds a directory name,
|
||||||
|
@ -1761,7 +1765,7 @@ find_module_path(char *fullname, const char *name, PyObject *path,
|
||||||
#ifdef HAVE_STAT
|
#ifdef HAVE_STAT
|
||||||
if (stat(buf, &statbuf) == 0 && /* it exists */
|
if (stat(buf, &statbuf) == 0 && /* it exists */
|
||||||
S_ISDIR(statbuf.st_mode) && /* it's a directory */
|
S_ISDIR(statbuf.st_mode) && /* it's a directory */
|
||||||
case_ok(buf, len, namelen, name)) { /* case matches */
|
case_ok(buf, len, namelen, namestr)) { /* case matches */
|
||||||
if (find_init_module(buf)) { /* and has __init__.py */
|
if (find_init_module(buf)) { /* and has __init__.py */
|
||||||
*p_fd = &fd_package;
|
*p_fd = &fd_package;
|
||||||
return 2;
|
return 2;
|
||||||
|
@ -1784,7 +1788,7 @@ find_module_path(char *fullname, const char *name, PyObject *path,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Find a module in search_path_list. For each path, try
|
/* Find a module in search_path_list. For each path, try
|
||||||
find_module_filename() or try each _PyImport_Filetab suffix.
|
find_module_path() or try each _PyImport_Filetab suffix.
|
||||||
|
|
||||||
If the module is found, return a file descriptor, write the path in
|
If the module is found, return a file descriptor, write the path in
|
||||||
*p_filename, write the pointer to the file object into *p_fp, and (if
|
*p_filename, write the pointer to the file object into *p_fp, and (if
|
||||||
|
@ -1793,7 +1797,7 @@ find_module_path(char *fullname, const char *name, PyObject *path,
|
||||||
Otherwise, raise an exception and return NULL. */
|
Otherwise, raise an exception and return NULL. */
|
||||||
|
|
||||||
static struct filedescr*
|
static struct filedescr*
|
||||||
find_module_path_list(char *fullname, const char *name,
|
find_module_path_list(PyObject *fullname, PyObject *name,
|
||||||
PyObject *search_path_list, PyObject *path_hooks,
|
PyObject *search_path_list, PyObject *path_hooks,
|
||||||
PyObject *path_importer_cache,
|
PyObject *path_importer_cache,
|
||||||
char *buf, size_t buflen,
|
char *buf, size_t buflen,
|
||||||
|
@ -1804,9 +1808,11 @@ find_module_path_list(char *fullname, const char *name,
|
||||||
struct filedescr *fdp = NULL;
|
struct filedescr *fdp = NULL;
|
||||||
char *filemode;
|
char *filemode;
|
||||||
FILE *fp = NULL;
|
FILE *fp = NULL;
|
||||||
|
char *namestr;
|
||||||
|
|
||||||
npath = PyList_Size(search_path_list);
|
npath = PyList_Size(search_path_list);
|
||||||
namelen = strlen(name);
|
namestr = _PyUnicode_AsString(name);
|
||||||
|
namelen = strlen(namestr);
|
||||||
for (i = 0; i < npath; i++) {
|
for (i = 0; i < npath; i++) {
|
||||||
PyObject *path;
|
PyObject *path;
|
||||||
int ok;
|
int ok;
|
||||||
|
@ -1836,7 +1842,7 @@ find_module_path_list(char *fullname, const char *name,
|
||||||
filemode = "r" PY_STDIOTEXTMODE;
|
filemode = "r" PY_STDIOTEXTMODE;
|
||||||
fp = fopen(buf, filemode);
|
fp = fopen(buf, filemode);
|
||||||
if (fp != NULL) {
|
if (fp != NULL) {
|
||||||
if (case_ok(buf, len, namelen, name))
|
if (case_ok(buf, len, namelen, namestr))
|
||||||
break;
|
break;
|
||||||
else { /* continue search */
|
else { /* continue search */
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
@ -1849,7 +1855,7 @@ find_module_path_list(char *fullname, const char *name,
|
||||||
}
|
}
|
||||||
if (fp == NULL) {
|
if (fp == NULL) {
|
||||||
PyErr_Format(PyExc_ImportError,
|
PyErr_Format(PyExc_ImportError,
|
||||||
"No module named %.200s", name);
|
"No module named %U", name);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
*p_fp = fp;
|
*p_fp = fp;
|
||||||
|
@ -1882,21 +1888,20 @@ find_module_path_list(char *fullname, const char *name,
|
||||||
set) are set to NULL. Eg. *buf is an empty string for a builtin package. */
|
set) are set to NULL. Eg. *buf is an empty string for a builtin package. */
|
||||||
|
|
||||||
static struct filedescr *
|
static struct filedescr *
|
||||||
find_module(char *fullname, const char *name, PyObject *search_path_list,
|
find_module(PyObject *fullname, PyObject *name, PyObject *search_path_list,
|
||||||
char *buf, size_t buflen, FILE **p_fp, PyObject **p_loader)
|
char *buf, size_t buflen, FILE **p_fp, PyObject **p_loader)
|
||||||
{
|
{
|
||||||
Py_ssize_t i, npath;
|
Py_ssize_t i, npath;
|
||||||
static struct filedescr fd_frozen = {"", "", PY_FROZEN};
|
static struct filedescr fd_frozen = {"", "", PY_FROZEN};
|
||||||
static struct filedescr fd_builtin = {"", "", C_BUILTIN};
|
static struct filedescr fd_builtin = {"", "", C_BUILTIN};
|
||||||
PyObject *path_hooks, *path_importer_cache;
|
PyObject *path_hooks, *path_importer_cache;
|
||||||
PyObject *fullname_obj, *nameobj;
|
|
||||||
|
|
||||||
*buf = '\0';
|
*buf = '\0';
|
||||||
*p_fp = NULL;
|
*p_fp = NULL;
|
||||||
if (p_loader != NULL)
|
if (p_loader != NULL)
|
||||||
*p_loader = NULL;
|
*p_loader = NULL;
|
||||||
|
|
||||||
if (strlen(name) > MAXPATHLEN) {
|
if (PyUnicode_GET_SIZE(name) > MAXPATHLEN) {
|
||||||
PyErr_SetString(PyExc_OverflowError,
|
PyErr_SetString(PyExc_OverflowError,
|
||||||
"module name is too long");
|
"module name is too long");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1919,7 +1924,7 @@ find_module(char *fullname, const char *name, PyObject *search_path_list,
|
||||||
PyObject *loader;
|
PyObject *loader;
|
||||||
PyObject *hook = PyList_GetItem(meta_path, i);
|
PyObject *hook = PyList_GetItem(meta_path, i);
|
||||||
loader = PyObject_CallMethod(hook, "find_module",
|
loader = PyObject_CallMethod(hook, "find_module",
|
||||||
"sO", fullname,
|
"OO", fullname,
|
||||||
search_path_list != NULL ?
|
search_path_list != NULL ?
|
||||||
search_path_list : Py_None);
|
search_path_list : Py_None);
|
||||||
if (loader == NULL) {
|
if (loader == NULL) {
|
||||||
|
@ -1937,17 +1942,10 @@ find_module(char *fullname, const char *name, PyObject *search_path_list,
|
||||||
Py_DECREF(meta_path);
|
Py_DECREF(meta_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fullname != NULL) {
|
if (find_frozen(fullname) != NULL) {
|
||||||
fullname_obj = PyUnicode_FromString(fullname);
|
strcpy(buf, _PyUnicode_AsString(fullname));
|
||||||
if (fullname == NULL)
|
|
||||||
return NULL;
|
|
||||||
if (find_frozen(fullname_obj) != NULL) {
|
|
||||||
Py_DECREF(fullname_obj);
|
|
||||||
strcpy(buf, fullname);
|
|
||||||
return &fd_frozen;
|
return &fd_frozen;
|
||||||
}
|
}
|
||||||
Py_DECREF(fullname_obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (search_path_list == NULL) {
|
if (search_path_list == NULL) {
|
||||||
#ifdef MS_COREDLL
|
#ifdef MS_COREDLL
|
||||||
|
@ -1955,18 +1953,13 @@ find_module(char *fullname, const char *name, PyObject *search_path_list,
|
||||||
struct filedescr *fdp;
|
struct filedescr *fdp;
|
||||||
PyObject *filename, *filename_bytes;
|
PyObject *filename, *filename_bytes;
|
||||||
#endif
|
#endif
|
||||||
nameobj = PyUnicode_FromString(name);
|
if (is_builtin(name)) {
|
||||||
if (nameobj == NULL)
|
strcpy(buf, _PyUnicode_AsString(name));
|
||||||
return NULL;
|
|
||||||
if (is_builtin(nameobj)) {
|
|
||||||
Py_DECREF(nameobj);
|
|
||||||
strcpy(buf, name);
|
|
||||||
return &fd_builtin;
|
return &fd_builtin;
|
||||||
}
|
}
|
||||||
#ifdef MS_COREDLL
|
#ifdef MS_COREDLL
|
||||||
fp = _PyWin_FindRegisteredModule(nameobj, &fdp, &filename);
|
fp = _PyWin_FindRegisteredModule(name, &fdp, &filename);
|
||||||
if (fp != NULL) {
|
if (fp != NULL) {
|
||||||
Py_DECREF(nameobj);
|
|
||||||
filename_bytes = PyUnicode_EncodeFSDefault(filename);
|
filename_bytes = PyUnicode_EncodeFSDefault(filename);
|
||||||
Py_DECREF(filename);
|
Py_DECREF(filename);
|
||||||
if (filename_bytes == NULL)
|
if (filename_bytes == NULL)
|
||||||
|
@ -1980,7 +1973,6 @@ find_module(char *fullname, const char *name, PyObject *search_path_list,
|
||||||
else if (PyErr_Occurred())
|
else if (PyErr_Occurred())
|
||||||
return NULL;
|
return NULL;
|
||||||
#endif
|
#endif
|
||||||
Py_DECREF(nameobj);
|
|
||||||
search_path_list = PySys_GetObject("path");
|
search_path_list = PySys_GetObject("path");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3139,8 +3131,8 @@ import_submodule(PyObject *mod, PyObject *subname, PyObject *fullname)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fdp = find_module(_PyUnicode_AsString(fullname),
|
fdp = find_module(fullname,
|
||||||
_PyUnicode_AsString(subname),
|
subname,
|
||||||
path, buf, MAXPATHLEN+1,
|
path, buf, MAXPATHLEN+1,
|
||||||
&fp, &loader);
|
&fp, &loader);
|
||||||
Py_XDECREF(path);
|
Py_XDECREF(path);
|
||||||
|
@ -3180,12 +3172,13 @@ PyImport_ReloadModule(PyObject *m)
|
||||||
PyInterpreterState *interp = PyThreadState_Get()->interp;
|
PyInterpreterState *interp = PyThreadState_Get()->interp;
|
||||||
PyObject *modules_reloading = interp->modules_reloading;
|
PyObject *modules_reloading = interp->modules_reloading;
|
||||||
PyObject *modules = PyImport_GetModuleDict();
|
PyObject *modules = PyImport_GetModuleDict();
|
||||||
PyObject *path = NULL, *loader, *existing_m = NULL;
|
|
||||||
char *name, *subname;
|
|
||||||
char buf[MAXPATHLEN+1];
|
char buf[MAXPATHLEN+1];
|
||||||
|
PyObject *path = NULL, *loader = NULL, *existing_m = NULL;
|
||||||
|
PyObject *nameobj, *bufobj, *subnameobj;
|
||||||
|
Py_UNICODE *name, *subname;
|
||||||
struct filedescr *fdp;
|
struct filedescr *fdp;
|
||||||
FILE *fp;
|
FILE *fp = NULL;
|
||||||
PyObject *newm, *nameobj, *bufobj;
|
PyObject *newm = NULL;
|
||||||
|
|
||||||
if (modules_reloading == NULL) {
|
if (modules_reloading == NULL) {
|
||||||
Py_FatalError("PyImport_ReloadModule: "
|
Py_FatalError("PyImport_ReloadModule: "
|
||||||
|
@ -3198,70 +3191,76 @@ PyImport_ReloadModule(PyObject *m)
|
||||||
"reload() argument must be module");
|
"reload() argument must be module");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
name = (char*)PyModule_GetName(m);
|
nameobj = PyModule_GetNameObject(m);
|
||||||
if (name == NULL)
|
if (nameobj == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (m != PyDict_GetItemString(modules, name)) {
|
if (m != PyDict_GetItem(modules, nameobj)) {
|
||||||
PyErr_Format(PyExc_ImportError,
|
PyErr_Format(PyExc_ImportError,
|
||||||
"reload(): module %.200s not in sys.modules",
|
"reload(): module %U not in sys.modules",
|
||||||
name);
|
nameobj);
|
||||||
|
Py_DECREF(nameobj);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
existing_m = PyDict_GetItemString(modules_reloading, name);
|
existing_m = PyDict_GetItem(modules_reloading, nameobj);
|
||||||
if (existing_m != NULL) {
|
if (existing_m != NULL) {
|
||||||
/* Due to a recursive reload, this module is already
|
/* Due to a recursive reload, this module is already
|
||||||
being reloaded. */
|
being reloaded. */
|
||||||
|
Py_DECREF(nameobj);
|
||||||
Py_INCREF(existing_m);
|
Py_INCREF(existing_m);
|
||||||
return existing_m;
|
return existing_m;
|
||||||
}
|
}
|
||||||
if (PyDict_SetItemString(modules_reloading, name, m) < 0)
|
if (PyDict_SetItem(modules_reloading, nameobj, m) < 0) {
|
||||||
|
Py_DECREF(nameobj);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
subname = strrchr(name, '.');
|
name = PyUnicode_AS_UNICODE(nameobj);
|
||||||
if (subname == NULL)
|
subname = Py_UNICODE_strrchr(name, '.');
|
||||||
subname = name;
|
if (subname == NULL) {
|
||||||
|
Py_INCREF(nameobj);
|
||||||
|
subnameobj = nameobj;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
PyObject *parentname, *parent;
|
PyObject *parentname, *parent;
|
||||||
parentname = PyUnicode_FromStringAndSize(name, (subname-name));
|
Py_ssize_t len;
|
||||||
|
len = subname - name;
|
||||||
|
parentname = PyUnicode_FromUnicode(name, len);
|
||||||
if (parentname == NULL) {
|
if (parentname == NULL) {
|
||||||
imp_modules_reloading_clear();
|
goto error;
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
parent = PyDict_GetItem(modules, parentname);
|
parent = PyDict_GetItem(modules, parentname);
|
||||||
if (parent == NULL) {
|
if (parent == NULL) {
|
||||||
PyErr_Format(PyExc_ImportError,
|
PyErr_Format(PyExc_ImportError,
|
||||||
"reload(): parent %R not in sys.modules",
|
"reload(): parent %U not in sys.modules",
|
||||||
parentname);
|
parentname);
|
||||||
Py_DECREF(parentname);
|
Py_DECREF(parentname);
|
||||||
imp_modules_reloading_clear();
|
goto error;
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
Py_DECREF(parentname);
|
Py_DECREF(parentname);
|
||||||
subname++;
|
|
||||||
path = PyObject_GetAttrString(parent, "__path__");
|
path = PyObject_GetAttrString(parent, "__path__");
|
||||||
if (path == NULL)
|
if (path == NULL)
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
|
subname++;
|
||||||
|
len = PyUnicode_GET_SIZE(nameobj) - (len + 1);
|
||||||
|
subnameobj = PyUnicode_FromUnicode(subname, len);
|
||||||
}
|
}
|
||||||
fdp = find_module(name, subname, path, buf, MAXPATHLEN+1, &fp, &loader);
|
if (subnameobj == NULL)
|
||||||
|
goto error;
|
||||||
|
fdp = find_module(nameobj, subnameobj,
|
||||||
|
path, buf, MAXPATHLEN+1, &fp, &loader);
|
||||||
|
Py_DECREF(subnameobj);
|
||||||
Py_XDECREF(path);
|
Py_XDECREF(path);
|
||||||
|
|
||||||
if (fdp == NULL) {
|
if (fdp == NULL) {
|
||||||
Py_XDECREF(loader);
|
Py_XDECREF(loader);
|
||||||
imp_modules_reloading_clear();
|
goto error;
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nameobj = PyUnicode_FromString(name);
|
|
||||||
if (nameobj != NULL) {
|
|
||||||
bufobj = PyUnicode_DecodeFSDefault(buf);
|
bufobj = PyUnicode_DecodeFSDefault(buf);
|
||||||
if (bufobj != NULL) {
|
if (bufobj != NULL) {
|
||||||
newm = load_module(nameobj, fp, bufobj, fdp->type, loader);
|
newm = load_module(nameobj, fp, bufobj, fdp->type, loader);
|
||||||
Py_DECREF(bufobj);
|
Py_DECREF(bufobj);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
newm = NULL;
|
|
||||||
Py_DECREF(nameobj);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
newm = NULL;
|
newm = NULL;
|
||||||
Py_XDECREF(loader);
|
Py_XDECREF(loader);
|
||||||
|
@ -3274,9 +3273,12 @@ PyImport_ReloadModule(PyObject *m)
|
||||||
* going to return NULL in this case regardless of whether
|
* going to return NULL in this case regardless of whether
|
||||||
* replacing name succeeds, so the return value is ignored.
|
* replacing name succeeds, so the return value is ignored.
|
||||||
*/
|
*/
|
||||||
PyDict_SetItemString(modules, name, m);
|
PyDict_SetItem(modules, nameobj, m);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
error:
|
||||||
imp_modules_reloading_clear();
|
imp_modules_reloading_clear();
|
||||||
|
Py_DECREF(nameobj);
|
||||||
return newm;
|
return newm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3424,7 +3426,7 @@ imp_get_suffixes(PyObject *self, PyObject *noargs)
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
call_find_module(char *name, PyObject *path)
|
call_find_module(PyObject *name, PyObject *path)
|
||||||
{
|
{
|
||||||
extern int fclose(FILE *);
|
extern int fclose(FILE *);
|
||||||
PyObject *fob, *ret;
|
PyObject *fob, *ret;
|
||||||
|
@ -3483,15 +3485,11 @@ call_find_module(char *name, PyObject *path)
|
||||||
static PyObject *
|
static PyObject *
|
||||||
imp_find_module(PyObject *self, PyObject *args)
|
imp_find_module(PyObject *self, PyObject *args)
|
||||||
{
|
{
|
||||||
PyObject *name;
|
PyObject *name, *path_list = NULL;
|
||||||
PyObject *ret, *path = NULL;
|
if (!PyArg_ParseTuple(args, "U|O:find_module",
|
||||||
if (!PyArg_ParseTuple(args, "O&|O:find_module",
|
&name, &path_list))
|
||||||
PyUnicode_FSConverter, &name,
|
|
||||||
&path))
|
|
||||||
return NULL;
|
return NULL;
|
||||||
ret = call_find_module(PyBytes_AS_STRING(name), path);
|
return call_find_module(name, path_list);
|
||||||
Py_DECREF(name);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue