LCOV - code coverage report
Current view: top level - Python - importdl.c (source / functions) Hit Total Coverage
Test: CPython lcov report Lines: 23 34 67.6 %
Date: 2017-04-19 Functions: 1 1 100.0 %

          Line data    Source code
       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          54 : _PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp)
      23             : {
      24             :     PyObject *m;
      25             :     char *lastdot, *shortname, *packagecontext, *oldcontext;
      26             :     dl_funcptr p;
      27             : 
      28          54 :     if ((m = _PyImport_FindExtension(name, pathname)) != NULL) {
      29           0 :         Py_INCREF(m);
      30           0 :         return m;
      31             :     }
      32          54 :     lastdot = strrchr(name, '.');
      33          54 :     if (lastdot == NULL) {
      34          51 :         packagecontext = NULL;
      35          51 :         shortname = name;
      36             :     }
      37             :     else {
      38           3 :         packagecontext = name;
      39           3 :         shortname = lastdot+1;
      40             :     }
      41             : 
      42          54 :     p = _PyImport_GetDynLoadFunc(name, shortname, pathname, fp);
      43          54 :     if (PyErr_Occurred())
      44           0 :         return NULL;
      45          54 :     if (p == NULL) {
      46           0 :         PyErr_Format(PyExc_ImportError,
      47             :            "dynamic module does not define init function (init%.200s)",
      48             :                      shortname);
      49           0 :         return NULL;
      50             :     }
      51          54 :     oldcontext = _Py_PackageContext;
      52          54 :     _Py_PackageContext = packagecontext;
      53          54 :     (*p)();
      54          54 :     _Py_PackageContext = oldcontext;
      55          54 :     if (PyErr_Occurred())
      56           0 :         return NULL;
      57             : 
      58          54 :     m = PyDict_GetItemString(PyImport_GetModuleDict(), name);
      59          54 :     if (m == NULL) {
      60           0 :         PyErr_SetString(PyExc_SystemError,
      61             :                         "dynamic module not initialized properly");
      62           0 :         return NULL;
      63             :     }
      64             :     /* Remember the filename as the __file__ attribute */
      65          54 :     if (PyModule_AddStringConstant(m, "__file__", pathname) < 0)
      66           0 :         PyErr_Clear(); /* Not important enough to report */
      67             : 
      68          54 :     if (_PyImport_FixupExtension(name, pathname) == NULL)
      69           0 :         return NULL;
      70          54 :     if (Py_VerboseFlag)
      71           0 :         PySys_WriteStderr(
      72             :             "import %s # dynamically loaded from %s\n",
      73             :             name, pathname);
      74          54 :     Py_INCREF(m);
      75          54 :     return m;
      76             : }
      77             : 
      78             : #endif /* HAVE_DYNAMIC_LOADING */

Generated by: LCOV version 1.10