]> granicus.if.org Git - python/commitdiff
Fix importing of shared libraries from inside packages.
authorGuido van Rossum <guido@python.org>
Wed, 19 Nov 1997 18:53:33 +0000 (18:53 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 19 Nov 1997 18:53:33 +0000 (18:53 +0000)
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).

Python/importdl.c
Python/modsupport.c

index fffe2654e7c5be0010339045de8bdcfadc7498a9..7f35d13095896ff9bb018919fb7e1d36db36489b 100644 (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)
index 854439bb94e09de1225c03e4674b3b127b6aa576..12ecaf6b86b954256771849a8e94416b1a52af8d 100644 (file)
@@ -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);