cpython: ef2b6305d395 (original) (raw)
Mercurial > cpython
changeset 68716:ef2b6305d395
Issue #3080: _PyImport_LoadDynamicModule() uses Unicode for name and path Document also that dynamic module names are ASCII only [#3080]
Victor Stinner victor.stinner@haypocalc.com | |
---|---|
date | Mon, 14 Mar 2011 15:54:07 -0400 |
parents | bab42673674a |
children | d52f471fbbeb |
files | Python/import.c Python/importdl.c Python/importdl.h |
diffstat | 3 files changed, 60 insertions(+), 66 deletions(-)[+] [-] Python/import.c 54 Python/importdl.c 70 Python/importdl.h 2 |
line wrap: on
line diff
--- a/Python/import.c +++ b/Python/import.c @@ -2173,9 +2173,21 @@ load_module(char *name, FILE *fp, char * break; #ifdef HAVE_DYNAMIC_LOADING
- case C_EXTENSION: {
PyObject *nameobj, *pathobj;[](#l1.10)
nameobj = PyUnicode_FromString(name);[](#l1.11)
if (nameobj == NULL)[](#l1.12)
return NULL;[](#l1.13)
pathobj = PyUnicode_DecodeFSDefault(pathname);[](#l1.14)
if (pathobj == NULL) {[](#l1.15)
Py_DECREF(nameobj);[](#l1.16)
return NULL;[](#l1.17)
}[](#l1.18)
m = _PyImport_LoadDynamicModule(nameobj, pathobj, fp);[](#l1.19)
Py_DECREF(nameobj);[](#l1.20)
Py_DECREF(pathobj);[](#l1.21) break;[](#l1.22)
- }
#endif case PKG_DIRECTORY: @@ -2185,11 +2197,10 @@ load_module(char *name, FILE *fp, char * case C_BUILTIN: case PY_FROZEN: { PyObject *nameobj = PyUnicode_FromString(name);
if (nameobj != NULL) {[](#l1.31)
m = load_builtin(nameobj, type);[](#l1.32)
Py_DECREF(nameobj);[](#l1.33)
} else[](#l1.34)
m = NULL;[](#l1.35)
if (nameobj == NULL)[](#l1.36)
return NULL;[](#l1.37)
m = load_builtin(nameobj, type);[](#l1.38)
} @@ -3443,28 +3454,23 @@ imp_load_compiled(PyObject *self, PyObje static PyObject * imp_load_dynamic(PyObject *self, PyObject *args) {Py_DECREF(nameobj);[](#l1.39) break;[](#l1.40)
- char *name;
- PyObject *pathbytes;
- char *pathname;
- PyObject *fob = NULL;
- PyObject *m;
- FILE *fp = NULL;
- if (!PyArg_ParseTuple(args, "sO&|O:load_dynamic",
&name, PyUnicode_FSConverter, &pathbytes, &fob))[](#l1.54)
- if (!PyArg_ParseTuple(args, "UO&|O:load_dynamic",
&name, PyUnicode_FSDecoder, &pathname, &fob))[](#l1.59) return NULL;[](#l1.60)
- pathname = PyBytes_AS_STRING(pathbytes);
- if (fob) {
fp = get_file(pathname, fob, "r");[](#l1.63)
if (fp == NULL) {[](#l1.64)
Py_DECREF(pathbytes);[](#l1.65)
- if (fob != NULL) {
fp = get_file(NULL, fob, "r");[](#l1.67)
if (fp == NULL)[](#l1.68) return NULL;[](#l1.69)
- else
fp = NULL;[](#l1.75)
- mod = _PyImport_LoadDynamicModule(name, pathname, fp); if (fp) fclose(fp);
} #endif /* HAVE_DYNAMIC_LOADING */
--- a/Python/importdl.c +++ b/Python/importdl.c @@ -15,67 +15,68 @@ extern dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname, const char *pathname, FILE fp); - +/ name should be ASCII only because the C language doesn't accept non-ASCII
PyObject * -_PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp) +_PyImport_LoadDynamicModule(PyObject *name, PyObject *path, FILE *fp) { PyObject *m;
- PyObject *pathbytes;
- char *namestr, *lastdot, *shortname, *packagecontext, oldcontext; dl_funcptr p0; PyObject (*p)(void); struct PyModuleDef *def;
- nameobj = PyUnicode_FromString(name);
- if (nameobj == NULL)
return NULL;[](#l2.33)
- m = _PyImport_FindExtensionObject(nameobj, path);
Py_DECREF(nameobj);[](#l2.37) Py_INCREF(m);[](#l2.38)
result = m;[](#l2.39)
goto finally;[](#l2.40)
shortname = name;[](#l2.49)
packagecontext = name;[](#l2.53)
- pathbytes = PyUnicode_EncodeFSDefault(path);
- if (pathbytes == NULL)
return NULL;[](#l2.61)
- p0 = _PyImport_GetDynLoadFunc(shortname,
PyBytes_AS_STRING(pathbytes), fp);[](#l2.63)
- Py_DECREF(pathbytes); p = (PyObject*(*)(void))p0; if (PyErr_Occurred())
goto error;[](#l2.67)
"dynamic module does not define init function (PyInit_%.200s)",[](#l2.71)
"dynamic module does not define init function"[](#l2.72)
" (PyInit_%s)",[](#l2.73) shortname);[](#l2.74)
goto error;[](#l2.75)
} oldcontext = _Py_PackageContext; _Py_PackageContext = packagecontext; m = (*p)(); _Py_PackageContext = oldcontext; if (m == NULL)return NULL;[](#l2.76)
goto error;[](#l2.83)
return NULL;[](#l2.84)
if (PyErr_Occurred()) { Py_DECREF(m); PyErr_Format(PyExc_SystemError, "initialization of %s raised unreported exception", shortname);
goto error;[](#l2.91)
} /* Remember pointer to module init function. */ @@ -88,26 +89,13 @@ PyObject * else Py_INCREF(path);return NULL;[](#l2.92)
- if (_PyImport_FixupExtensionObject(m, nameobj, path) < 0) {
Py_DECREF(nameobj);[](#l2.105)
goto error;[](#l2.106)
- } if (Py_VerboseFlag) PySys_FormatStderr(
"import %U # dynamically loaded from %s\n",[](#l2.110)
nameobj, pathname);[](#l2.111)
- Py_DECREF(nameobj);
- result = m;
- goto finally;
} #endif /* HAVE_DYNAMIC_LOADING */
--- a/Python/importdl.h +++ b/Python/importdl.h @@ -28,7 +28,7 @@ struct filedescr { extern struct filedescr * _PyImport_Filetab; extern const struct filedescr _PyImport_DynLoadFiletab[]; -extern PyObject *_PyImport_LoadDynamicModule(char *name, char *pathname, +extern PyObject *_PyImport_LoadDynamicModule(PyObject *name, PyObject *pathname, FILE ); / Max length of module suffix searched for -- accommodates "module.slb" */