Home | History | Annotate | Download | only in Python
      1 
      2 /* Support for dynamic loading of extension modules */
      3 
      4 #include "Python.h"
      5 
      6 /* ./configure sets HAVE_DYNAMIC_LOADING if dynamic loading of modules is
      7    supported on this platform. configure will then compile and link in one
      8    of the dynload_*.c files, as appropriate. We will call a function in
      9    those modules to get a function pointer to the module's init function.
     10 */
     11 #ifdef HAVE_DYNAMIC_LOADING
     12 
     13 #include "importdl.h"
     14 
     15 extern dl_funcptr _PyImport_GetDynLoadFunc(const char *name,
     16                                            const char *shortname,
     17                                            const char *pathname, FILE *fp);
     18 
     19 
     20 
     21 PyObject *
     22 _PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp)
     23 {
     24     PyObject *m;
     25     char *lastdot, *shortname, *packagecontext, *oldcontext;
     26     dl_funcptr p;
     27 
     28     if ((m = _PyImport_FindExtension(name, pathname)) != NULL) {
     29         Py_INCREF(m);
     30         return m;
     31     }
     32     lastdot = strrchr(name, '.');
     33     if (lastdot == NULL) {
     34         packagecontext = NULL;
     35         shortname = name;
     36     }
     37     else {
     38         packagecontext = name;
     39         shortname = lastdot+1;
     40     }
     41 
     42     p = _PyImport_GetDynLoadFunc(name, shortname, pathname, fp);
     43     if (PyErr_Occurred())
     44         return NULL;
     45     if (p == NULL) {
     46         PyErr_Format(PyExc_ImportError,
     47            "dynamic module does not define init function (init%.200s)",
     48                      shortname);
     49         return NULL;
     50     }
     51     oldcontext = _Py_PackageContext;
     52     _Py_PackageContext = packagecontext;
     53     (*p)();
     54     _Py_PackageContext = oldcontext;
     55     if (PyErr_Occurred())
     56         return NULL;
     57 
     58     m = PyDict_GetItemString(PyImport_GetModuleDict(), name);
     59     if (m == NULL) {
     60         PyErr_SetString(PyExc_SystemError,
     61                         "dynamic module not initialized properly");
     62         return NULL;
     63     }
     64     /* Remember the filename as the __file__ attribute */
     65     if (PyModule_AddStringConstant(m, "__file__", pathname) < 0)
     66         PyErr_Clear(); /* Not important enough to report */
     67 
     68     if (_PyImport_FixupExtension(name, pathname) == NULL)
     69         return NULL;
     70     if (Py_VerboseFlag)
     71         PySys_WriteStderr(
     72             "import %s # dynamically loaded from %s\n",
     73             name, pathname);
     74     Py_INCREF(m);
     75     return m;
     76 }
     77 
     78 #endif /* HAVE_DYNAMIC_LOADING */
     79