#else
PyObject *m, *d, *s;
char funcname[258];
+ char *lastdot, *shortname, *packagecontext;
dl_funcptr p = NULL;
#ifdef USE_SHLIB
static struct {
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;
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)
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
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);