diff options
| author | Guido van Rossum <guido@python.org> | 1997-11-19 18:53:33 +0000 |
|---|---|---|
| committer | Guido van Rossum <guido@python.org> | 1997-11-19 18:53:33 +0000 |
| commit | f5651ca6934912688e9176d187f0c22315c7c7cf (patch) | |
| tree | 946789cf3a17cff2af82cfab1f01da83706cae4b /Python/modsupport.c | |
| parent | f2756481e06617471a292ec7dc3b3c6104c8abf3 (diff) | |
| download | cpython-f5651ca6934912688e9176d187f0c22315c7c7cf.tar.gz | |
Fix importing of shared libraries from inside packages.
This is a bit of a hack: when the shared library is loaded, the module
name is "package.module", but the module calls Py_InitModule*() with just
"module" for the name. The shared library loader squirrels away the true
name of the module in _Py_PackageContext, and Py_InitModule*() will
substitute this (if the name actually matches).
Diffstat (limited to 'Python/modsupport.c')
| -rw-r--r-- | Python/modsupport.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/Python/modsupport.c b/Python/modsupport.c index 854439bb94..12ecaf6b86 100644 --- a/Python/modsupport.c +++ b/Python/modsupport.c @@ -39,6 +39,9 @@ typedef extended va_double; typedef double va_double; #endif +/* Package context -- the full module name for package imports */ +char *_Py_PackageContext = NULL; + /* Py_InitModule4() parameters: - name is the module name - methods is the list of top-level functions @@ -69,6 +72,13 @@ Py_InitModule4(name, methods, doc, passthrough, module_api_version) if (module_api_version != PYTHON_API_VERSION) fprintf(stderr, api_version_warning, name, PYTHON_API_VERSION, name, module_api_version); + if (_Py_PackageContext != NULL) { + char *p = strrchr(_Py_PackageContext, '.'); + if (p != NULL && strcmp(name, p+1) == 0) { + name = _Py_PackageContext; + _Py_PackageContext = NULL; + } + } if ((m = PyImport_AddModule(name)) == NULL) return NULL; d = PyModule_GetDict(m); |
