summaryrefslogtreecommitdiffstats
path: root/Python/modsupport.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1997-11-19 18:53:33 (GMT)
committerGuido van Rossum <guido@python.org>1997-11-19 18:53:33 (GMT)
commit2e58ff3ef56c3bf0a7080743ec77e95ca1758b97 (patch)
treeb4e43574becac26c33d0d35c55bd3d60138ab055 /Python/modsupport.c
parentee6fd1c392af19c7390bd1f8e25215fbd968a2c1 (diff)
downloadcpython-2e58ff3ef56c3bf0a7080743ec77e95ca1758b97.zip
cpython-2e58ff3ef56c3bf0a7080743ec77e95ca1758b97.tar.gz
cpython-2e58ff3ef56c3bf0a7080743ec77e95ca1758b97.tar.bz2
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.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/Python/modsupport.c b/Python/modsupport.c
index 854439b..12ecaf6 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);