[Python-Dev] [Python-checkins] cpython: _PyImport_LoadDynamicModule() encodes the module name explicitly to ASCII
Jim Jewett
jimjjewett at gmail.com
Mon May 9 15:00:17 CEST 2011
Are you asserting that all foreign modules (or at least all handled by
this) are in C, as opposed to C++ or even Java or Fortran? (And the C
won't change?)
Is this ASCII restriction (as opposed to even UTF8) really needed?
Or are you just saying that we need to create an ASCII name for passing to C?
-jJ
On 5/7/11, victor.stinner <python-checkins at python.org> wrote:
> http://hg.python.org/cpython/rev/eb003c3d1770
> changeset: 69889:eb003c3d1770
> user: Victor Stinner <victor.stinner at haypocalc.com>
> date: Sat May 07 12:46:05 2011 +0200
> summary:
> _PyImport_LoadDynamicModule() encodes the module name explicitly to ASCII
>
> The name must be encodable to ASCII because dynamic module must have a
> function
> called "PyInit_NAME", they are written in C, and the C language doesn't
> accept
> non-ASCII identifiers.
>
> files:
> Python/importdl.c | 40 +++++++++++++++++++++-------------
> 1 files changed, 25 insertions(+), 15 deletions(-)
>
>
> diff --git a/Python/importdl.c b/Python/importdl.c
> --- a/Python/importdl.c
> +++ b/Python/importdl.c
> @@ -20,31 +20,36 @@
> const char *pathname, FILE *fp);
> #endif
>
> -/* name should be ASCII only because the C language doesn't accept
> non-ASCII
> - identifiers, and dynamic modules are written in C. */
> -
> PyObject *
> _PyImport_LoadDynamicModule(PyObject *name, PyObject *path, FILE *fp)
> {
> - PyObject *m;
> + PyObject *m = NULL;
> #ifndef MS_WINDOWS
> PyObject *pathbytes;
> #endif
> + PyObject *nameascii;
> char *namestr, *lastdot, *shortname, *packagecontext, *oldcontext;
> dl_funcptr p0;
> PyObject* (*p)(void);
> struct PyModuleDef *def;
>
> - namestr = _PyUnicode_AsString(name);
> - if (namestr == NULL)
> - return NULL;
> -
> m = _PyImport_FindExtensionObject(name, path);
> if (m != NULL) {
> Py_INCREF(m);
> return m;
> }
>
> + /* name must be encodable to ASCII because dynamic module must have a
> + function called "PyInit_NAME", they are written in C, and the C
> language
> + doesn't accept non-ASCII identifiers. */
> + nameascii = PyUnicode_AsEncodedString(name, "ascii", NULL);
> + if (nameascii == NULL)
> + return NULL;
> +
> + namestr = PyBytes_AS_STRING(nameascii);
> + if (namestr == NULL)
> + goto error;
> +
> lastdot = strrchr(namestr, '.');
> if (lastdot == NULL) {
> packagecontext = NULL;
> @@ -60,34 +65,33 @@
> #else
> pathbytes = PyUnicode_EncodeFSDefault(path);
> if (pathbytes == NULL)
> - return NULL;
> + goto error;
> p0 = _PyImport_GetDynLoadFunc(shortname,
> PyBytes_AS_STRING(pathbytes), fp);
> Py_DECREF(pathbytes);
> #endif
> p = (PyObject*(*)(void))p0;
> if (PyErr_Occurred())
> - return NULL;
> + goto error;
> if (p == NULL) {
> PyErr_Format(PyExc_ImportError,
> "dynamic module does not define init function"
> " (PyInit_%s)",
> shortname);
> - return NULL;
> + goto error;
> }
> oldcontext = _Py_PackageContext;
> _Py_PackageContext = packagecontext;
> m = (*p)();
> _Py_PackageContext = oldcontext;
> if (m == NULL)
> - return NULL;
> + goto error;
>
> if (PyErr_Occurred()) {
> - Py_DECREF(m);
> PyErr_Format(PyExc_SystemError,
> "initialization of %s raised unreported exception",
> shortname);
> - return NULL;
> + goto error;
> }
>
> /* Remember pointer to module init function. */
> @@ -101,12 +105,18 @@
> Py_INCREF(path);
>
> if (_PyImport_FixupExtensionObject(m, name, path) < 0)
> - return NULL;
> + goto error;
> if (Py_VerboseFlag)
> PySys_FormatStderr(
> "import %U # dynamically loaded from %R\n",
> name, path);
> + Py_DECREF(nameascii);
> return m;
> +
> +error:
> + Py_DECREF(nameascii);
> + Py_XDECREF(m);
> + return NULL;
> }
>
> #endif /* HAVE_DYNAMIC_LOADING */
>
> --
> Repository URL: http://hg.python.org/cpython
>
More information about the Python-Dev
mailing list