summaryrefslogtreecommitdiff
path: root/Python/importdl.c
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2008-06-11 05:26:20 +0000
committerMartin v. Löwis <martin@v.loewis.de>2008-06-11 05:26:20 +0000
commit1a21451b1d73b65af949193208372e86bf308411 (patch)
tree8e98d7be9e249b011ae9380479656e5284ec0234 /Python/importdl.c
parentcdf94635d7e364f9ce1905bafa5b540f4d16147c (diff)
downloadcpython-git-1a21451b1d73b65af949193208372e86bf308411.tar.gz
Implement PEP 3121: new module initialization and finalization API.
Diffstat (limited to 'Python/importdl.c')
-rw-r--r--Python/importdl.c30
1 files changed, 19 insertions, 11 deletions
diff --git a/Python/importdl.c b/Python/importdl.c
index 19e7d6deb1..d214ba1bb8 100644
--- a/Python/importdl.c
+++ b/Python/importdl.c
@@ -24,7 +24,9 @@ _PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp)
PyObject *m;
PyObject *path;
char *lastdot, *shortname, *packagecontext, *oldcontext;
- dl_funcptr p;
+ dl_funcptr p0;
+ PyObject* (*p)(void);
+ struct PyModuleDef *def;
if ((m = _PyImport_FindExtension(name, pathname)) != NULL) {
Py_INCREF(m);
@@ -40,40 +42,46 @@ _PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp)
shortname = lastdot+1;
}
- p = _PyImport_GetDynLoadFunc(name, shortname, pathname, fp);
+ p0 = _PyImport_GetDynLoadFunc(name, shortname, pathname, fp);
+ p = (PyObject*(*)(void))p0;
if (PyErr_Occurred())
return NULL;
if (p == NULL) {
PyErr_Format(PyExc_ImportError,
- "dynamic module does not define init function (init%.200s)",
+ "dynamic module does not define init function (PyInit_%.200s)",
shortname);
return NULL;
}
oldcontext = _Py_PackageContext;
_Py_PackageContext = packagecontext;
- (*p)();
+ m = (*p)();
_Py_PackageContext = oldcontext;
- if (PyErr_Occurred())
+ if (m == NULL)
return NULL;
- m = PyDict_GetItemString(PyImport_GetModuleDict(), name);
- if (m == NULL) {
- PyErr_SetString(PyExc_SystemError,
- "dynamic module not initialized properly");
+ if (PyErr_Occurred()) {
+ Py_DECREF(m);
+ PyErr_Format(PyExc_SystemError,
+ "initialization of %s raised unreported exception",
+ shortname);
return NULL;
}
+
+ /* Remember pointer to module init function. */
+ def = PyModule_GetDef(m);
+ def->m_base.m_init = p;
+
/* Remember the filename as the __file__ attribute */
path = PyUnicode_DecodeFSDefault(pathname);
if (PyModule_AddObject(m, "__file__", path) < 0)
PyErr_Clear(); /* Not important enough to report */
- if (_PyImport_FixupExtension(name, pathname) == NULL)
+ if (_PyImport_FixupExtension(m, name, pathname) < 0)
return NULL;
if (Py_VerboseFlag)
PySys_WriteStderr(
"import %s # dynamically loaded from %s\n",
name, pathname);
- Py_INCREF(m);
return m;
}