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 */
|