diff options
author | Martin v. Löwis <martin@v.loewis.de> | 2008-06-11 05:26:20 (GMT) |
---|---|---|
committer | Martin v. Löwis <martin@v.loewis.de> | 2008-06-11 05:26:20 (GMT) |
commit | 1a21451b1d73b65af949193208372e86bf308411 (patch) | |
tree | 8e98d7be9e249b011ae9380479656e5284ec0234 /Python/importdl.c | |
parent | cdf94635d7e364f9ce1905bafa5b540f4d16147c (diff) | |
download | cpython-1a21451b1d73b65af949193208372e86bf308411.zip cpython-1a21451b1d73b65af949193208372e86bf308411.tar.gz cpython-1a21451b1d73b65af949193208372e86bf308411.tar.bz2 |
Implement PEP 3121: new module initialization and finalization API.
Diffstat (limited to 'Python/importdl.c')
-rw-r--r-- | Python/importdl.c | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/Python/importdl.c b/Python/importdl.c index 19e7d6d..d214ba1 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; } |