summaryrefslogtreecommitdiffstats
path: root/Python/importdl.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/importdl.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/importdl.c')
-rw-r--r--Python/importdl.c19
1 files changed, 16 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)