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).
This commit is contained in:
Guido van Rossum 1997-11-19 18:53:33 +00:00
parent ee6fd1c392
commit 2e58ff3ef5
2 changed files with 26 additions and 3 deletions

View file

@ -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)