diff Python/modsupport.c @ 6602:4514a5ea3ec4 legacy-trunk

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).
author Guido van Rossum <guido@python.org>
date Wed, 19 Nov 1997 18:53:33 +0000
parents 93304b2e14cb
children 2e874a5a912f
line wrap: on
line diff
--- a/Python/modsupport.c	Wed Nov 19 18:51:35 1997 +0000
+++ b/Python/modsupport.c	Wed Nov 19 18:53:33 1997 +0000
@@ -39,6 +39,9 @@
 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 @@
 	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);