diff options
Diffstat (limited to 'Python/importdl.c')
| -rw-r--r-- | Python/importdl.c | 87 | 
1 files changed, 52 insertions, 35 deletions
| diff --git a/Python/importdl.c b/Python/importdl.c index 9caed45..942e4b8 100644 --- a/Python/importdl.c +++ b/Python/importdl.c @@ -12,50 +12,73 @@  #include "importdl.h" -extern dl_funcptr _PyImport_GetDynLoadFunc(const char *name, -                                           const char *shortname, +#ifdef MS_WINDOWS +extern dl_funcptr _PyImport_GetDynLoadWindows(const char *shortname, +                                              PyObject *pathname, FILE *fp); +#else +extern dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname,                                             const char *pathname, FILE *fp); - - +#endif  PyObject * -_PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp) +_PyImport_LoadDynamicModule(PyObject *name, PyObject *path, FILE *fp)  { -    PyObject *m; -    PyObject *path; -    char *lastdot, *shortname, *packagecontext, *oldcontext; +    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; -    PyObject *result; - -    path = PyUnicode_DecodeFSDefault(pathname); -    if (path == NULL) -        return NULL; -    if ((m = _PyImport_FindExtensionUnicode(name, path)) != NULL) { +    m = _PyImport_FindExtensionObject(name, path); +    if (m != NULL) {          Py_INCREF(m); -        result = m; -        goto finally; +        return m;      } -    lastdot = strrchr(name, '.'); + +    /* 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; -        shortname = name; +        shortname = namestr;      }      else { -        packagecontext = name; +        packagecontext = namestr;          shortname = lastdot+1;      } -    p0 = _PyImport_GetDynLoadFunc(name, shortname, pathname, fp); +#ifdef MS_WINDOWS +    p0 = _PyImport_GetDynLoadWindows(shortname, path, fp); +#else +    pathbytes = PyUnicode_EncodeFSDefault(path); +    if (pathbytes == NULL) +        goto error; +    p0 = _PyImport_GetDynLoadFunc(shortname, +                                  PyBytes_AS_STRING(pathbytes), fp); +    Py_DECREF(pathbytes); +#endif      p = (PyObject*(*)(void))p0;      if (PyErr_Occurred())          goto error;      if (p == NULL) { -        PyErr_Format(PyExc_ImportError, -           "dynamic module does not define init function (PyInit_%.200s)", -                     shortname); +        PyObject *msg = PyUnicode_FromFormat("dynamic module does not define " +                                             "init function (PyInit_%s)", +                                             shortname); +        PyErr_SetImportError(msg, name, path); +        Py_DECREF(msg);          goto error;      }      oldcontext = _Py_PackageContext; @@ -66,7 +89,6 @@ _PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp)          goto error;      if (PyErr_Occurred()) { -        Py_DECREF(m);          PyErr_Format(PyExc_SystemError,                       "initialization of %s raised unreported exception",                       shortname); @@ -83,20 +105,15 @@ _PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp)      else          Py_INCREF(path); -    if (_PyImport_FixupExtensionUnicode(m, name, path) < 0) +    if (_PyImport_FixupExtensionObject(m, name, path) < 0)          goto error; -    if (Py_VerboseFlag) -        PySys_WriteStderr( -            "import %s # dynamically loaded from %s\n", -            name, pathname); -    result = m; -    goto finally; +    Py_DECREF(nameascii); +    return m;  error: -    result = NULL; -finally: -    Py_DECREF(path); -    return result; +    Py_DECREF(nameascii); +    Py_XDECREF(m); +    return NULL;  }  #endif /* HAVE_DYNAMIC_LOADING */ | 
