diff options
author | Guido van Rossum <guido@python.org> | 1997-11-19 18:53:33 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1997-11-19 18:53:33 (GMT) |
commit | 2e58ff3ef56c3bf0a7080743ec77e95ca1758b97 (patch) | |
tree | b4e43574becac26c33d0d35c55bd3d60138ab055 /Python | |
parent | ee6fd1c392af19c7390bd1f8e25215fbd968a2c1 (diff) | |
download | cpython-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')
-rw-r--r-- | Python/importdl.c | 19 | ||||
-rw-r--r-- | Python/modsupport.c | 10 |
2 files changed, 26 insertions, 3 deletions
diff --git a/Python/importdl.c b/Python/importdl.c index fffe265..7f35d13 100644 --- a/Python/importdl.c +++ b/Python/importdl.c @@ -233,6 +233,7 @@ _PyImport_LoadDynamicModule(name, pathname, fp) #else PyObject *m, *d, *s; char funcname[258]; + char *lastdot, *shortname, *packagecontext; dl_funcptr p = NULL; #ifdef USE_SHLIB static struct { @@ -252,7 +253,16 @@ _PyImport_LoadDynamicModule(name, pathname, fp) Py_INCREF(m); return m; } - sprintf(funcname, FUNCNAME_PATTERN, name); + lastdot = strrchr(name, '.'); + if (lastdot == NULL) { + packagecontext = NULL; + shortname = name; + } + else { + packagecontext = name; + shortname = lastdot+1; + } + sprintf(funcname, FUNCNAME_PATTERN, shortname); #ifdef USE_SHLIB if (fp != NULL) { int i; @@ -519,11 +529,14 @@ _PyImport_LoadDynamicModule(name, pathname, fp) got_it: #endif if (p == NULL) { - PyErr_SetString(PyExc_ImportError, - "dynamic module does not define init function"); + PyErr_Format(PyExc_ImportError, + "dynamic module does not define init function (%s)", + funcname); return NULL; } + _Py_PackageContext = packagecontext; (*p)(); + _Py_PackageContext = NULL; if (PyErr_Occurred()) return NULL; if (_PyImport_FixupExtension(name, pathname) == NULL) 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); |