Mercurial > cpython-lru_cache-weakref
diff Python/importdl.c @ 47580:94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
| author | Martin v. Löwis <martin@v.loewis.de> |
|---|---|
| date | Wed, 11 Jun 2008 05:26:20 +0000 |
| parents | 50599bbb0c67 |
| children | cab14be0ada1 |
line wrap: on
line diff
--- a/Python/importdl.c Wed Jun 11 03:41:00 2008 +0000 +++ b/Python/importdl.c Wed Jun 11 05:26:20 2008 +0000 @@ -24,7 +24,9 @@ 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 @@ 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; }
